12 Mart 2012 Pazartesi

HttpWebRequest Sınıfıyla Web Servislerini Çağırmak

Web servislerini projelerimize eklerken servislerin adreslerini Visual Studionun web servisi ile ilgili tool’una yazarak ilgili web servisini referans olarak projelerimize ekleyebiliyoruz. Fakat proje ilerleyişinde bazen durumlar istediğimiz doğrultuda gelişmeyebiliyor. Örneğin web servisinin bulunduğu sunucuya erişim sadece projenin production sunucusundan yapılıyor. Bu durumda Visual Studio web servis toolunu kullanarak bu servisi projemize dahil edemiyoruz. Fakat bu servislere SOAP paketleri halinde, çalışma anında WebRequest sınıfını kullanarak projemizden ulaşabiliriz.

Bunun için küçük bir örnek üzerinden , yazmış olduğumuz bir servise httpRequest nesnesi ile nasıl erişebileceğimizi anlatmaya çalışacağım.Örneğimize servisimizi oluşturarak başlayabiliriz.

MessageService.asmx dosyamız aşağıdaki gibi string mesaj döndüren bir web metoda sahip olmalıdır.
  1. [WebService(Namespace = "http://tempuri.org/")]  
  2.     [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
  3.     [System.ComponentModel.ToolboxItem(false)]  
  4.     // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.  
  5.     // [System.Web.Script.Services.ScriptService]  
  6.     public class MessageService : System.Web.Services.WebService  
  7.     {  
  8.   
  9.         [WebMethod]  
  10.         public string TestMessage(string message)  
  11.         {  
  12.             return "your message is:'"+message+"'";  
  13.         }  
  14.     }  
Web servisimiz Http request nesnesi ile çağıracağımız sayfamızda aşağıdaki gibi bir yapıya sahip olmalıdır.
Default.aspx
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebServiceWithHttpRequest._Default" %>  
  2.   
  3.   
  4.   
  5. <form id="form1" runat="server">  
  6. <div>  
  7.       Your Message:<asp:textbox id="tbMessage" width="300" runat="server"></asp:textbox>     
  8.       <asp:button id="btnSend" runat="server" text="Send Message" onclick="btnSend_Click">  
  9.   
  10.        <asp:label id="lbResult" font-bold="true" runat="server" font-size="Large"></asp:label>  
  11.     </asp:button></div>  
  12. </form>  
Default.aspx.cs
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Web;  
  5. using System.Web.UI;  
  6. using System.Web.UI.WebControls;  
  7. using System.Net;  
  8. using System.IO;  
  9. using System.Text;  
  10. using System.Xml;  
  11. using System.Data;  
  12.   
  13. namespace WebServiceWithHttpRequest  
  14. {  
  15.     public partial class _Default : System.Web.UI.Page  
  16.     {  
  17.         protected void Page_Load(object sender, EventArgs e)  
  18.         {  
  19.         }  
  20.         public void MakeRequest(string message)  
  21.         {  
  22.             StringBuilder sb = new StringBuilder();  
  23.             sb.AppendLine("<!--?xml version=\"1.0\" encoding=\"utf-8\"?-->");  
  24.             sb.AppendLine("<soap:envelope xmlns:xsi="\"http://www.w3.org/2001/XMLSchema-instance\"" xmlns:xsd="\"http://www.w3.org/2001/XMLSchema\"" xmlns:soap="\"http://schemas.xmlsoap.org/soap/envelope/\"">");  
  25.             sb.AppendLine("<soap:body>");  
  26.             sb.AppendLine("<testmessage xmlns="\"http://tempuri.org/\"">");  
  27.             sb.AppendLine("<message>" + message + "</message>");  
  28.             sb.AppendLine("</testmessage>");  
  29.             sb.AppendLine("</soap:body>");  
  30.             sb.AppendLine("</soap:envelope>");  
  31.   
  32.             HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:4412/WebServices/MessageService.asmx");  
  33.             req.Headers.Add("SOAPAction""\"http://tempuri.org/TestMessage\"");  
  34.             req.ContentType = "text/xml;charset=\"utf-8\"";  
  35.             req.Accept = "text/xml";  
  36.             req.Method = "POST";  
  37.   
  38.             using (Stream stm = req.GetRequestStream())  
  39.             {  
  40.                 using (StreamWriter stmw = new StreamWriter(stm))  
  41.                 {  
  42.                     stmw.Write(sb.ToString());  
  43.                 }  
  44.             }  
  45.   
  46.             WebResponse response = req.GetResponse();  
  47.             StreamReader srreader = new StreamReader(response.GetResponseStream());  
  48.             XmlDocument xdoc = new XmlDocument();  
  49.             xdoc.LoadXml(srreader.ReadToEnd());  
  50.   
  51.             //Soap Result Format  
  52.             //<!--?xml version="1.0" encoding="utf-8"?-->  
  53.             //<soap:envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  
  54.             //  <soap:body>  
  55.             //    <testmessageresponse xmlns="http://tempuri.org/">  
  56.             //      <testmessageresult>string</testmessageresult>  
  57.             //    </testmessageresponse>  
  58.             //  </soap:body>  
  59.             //</soap:envelope>  
  60.             string innerMessage=xdoc.LastChild.InnerXml;  
  61.             int strindex = innerMessage.IndexOf("<testmessageresult>");  
  62.             int strendindex=innerMessage.IndexOf("</testmessageresult>");  
  63.             if (strindex != -1 && strendindex != -1)  
  64.                 lbResult.Text = innerMessage.Substring(strindex, strendindex - strindex);  
  65.             else  
  66.                 lbResult.Text = "Error in web service result format!";  
  67.             srreader.Close();  
  68.             srreader.Dispose();  
  69.   
  70.         }  
  71.   
  72.         protected void btnSend_Click(object sender, EventArgs e)  
  73.         {  
  74.             MakeRequest(tbMessage.Text);  
  75.   
  76.         }  
  77.     }  
  78.   
  79. }  
Web Servisimizi tarayıcıda açtığımızda aşağıdaki gibi bilgiler karşımız çıkacaktır.
Web Service Result
Yukarıda dökümanda ilk bölüm httpRequest nesnesinin property leri ile ilgili genel bilgileri içermektedir. Post yapılacak adres, SOAPAction, Content-Type, Content-Length gibi bilgileri içermektedir. Bu bilgileri kullanarak Default.aspx.cs sayfasında da göreceğiniz üzere herhangi bir sayfadan WSDL dökümanı ve gerekli dll leri projemize eklemeden web servislerini istediğimiz gibi çalıştırabiliyoruz.Yazımın başında da belirtiğim gibi web kullanılacak web servisine geliştirme ortamında erişimimiz olmadığı durumlarda sadece servis bilgilerine bakarak , pratik ve dinamik olarak web servislerini projelerimize çalışma anında ekleyebiliriz.

Hiç yorum yok: