2009-10-22 93 views
2

我想通過使用C#的http POST請求調用ASP.NET web服務(即,我不想使用運行wsdl.exe生成的SoapHttpClientProtocol對象)。通過http請求調用ASP.NET web服務方法

據我所知,該方法包括:

  1. 創建HttpWebRequest對象指向的URL/web服務,該方法的方法;

  2. 創建SOAP xml信封;

  3. 序列化我想使用XmlSerializer傳遞給Web方法的任何參數;

  4. 發出請求並解析響應。

我想這樣做,而不必複製和使用生成的代碼。

(1)看起來非常簡單; (2)我不知道這裏的信封是標準的,還是應該如何改變,這取決於我所調用的webservice方法。我想我可能需要添加自定義肥皂標題,如果需要的服務?

(3)這樣做的過程是什麼?我認爲我需要做這樣的事情:

MyClass myObj; 
XmlSerializer ser = new XmlSerializer(myObj.GetType()); 
TextWriter writer = new StringWriter(); 
ser.Serialize(writer, myObj); 
string soapXml = writer.ToString(); 
writer.Close(); 

而且,我想我應該在soapXml添加到SOAP:Body元素

(4)我相信我應該提取和反序列化的內容肥皂:身體元素。 (3)中的過程的反向可以嗎?

感謝,

K.

+1

只是好奇,爲什麼你想這樣做硬盤的方式?爲什麼不使用久經考驗的工具? – David 2009-10-22 19:06:15

+0

我在考慮在http請求級別訪問Web服務調用會讓我更好地控制諸如設置soap/http標頭之類的內容,例如...此外,有時,生成Web服務客戶端的wsdl可能不是可用(即使方法簽名已知)... – 2009-10-22 19:58:09

回答

7

我不知道我爲什麼這樣做,但這裏的手動調用Web服務的一個例子。請保證永遠不要在生產代碼中使用它。

假設你有以下SOAP服務:

public class Foo 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
public class Service1 : System.Web.Services.WebService 
{ 
    [WebMethod] 
    public string HelloWorld(Foo foo) 
    { 
     return "Hello World"; 
    } 
} 

您可以手動調用它像這樣:

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (WebClient client = new WebClient()) 
     { 
      client.Headers.Add("SOAPAction", "\"http://tempuri.org/HelloWorld\""); 
      client.Headers.Add("Content-Type", "text/xml; charset=utf-8"); 
      var payload = @"<?xml version=""1.0"" encoding=""utf-8""?><soap:Envelope xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema""><soap:Body><HelloWorld xmlns=""http://tempuri.org/""><foo><Id>1</Id><Name>Bar</Name></foo></HelloWorld></soap:Body></soap:Envelope>"; 
      var data = Encoding.UTF8.GetBytes(payload); 
      var result = client.UploadData("http://localhost:1475/Service1.asmx", data); 
      Console.WriteLine(Encoding.Default.GetString(result)); 
     } 
    } 
} 
+0

+1「不要在生產中試用」 – 2009-10-22 19:34:30

+0

達林,謝謝。 只是爲了澄清一下,在http請求級別調用webservice方法時是否存在固有的不良情況? 另外,給定一個web方法的簽名和參數,是否有一種構造肥皂體的通用方法? – 2009-10-22 19:55:22

+0

我想提名這個答案,因爲它有一定幫助,但任何人都可以幫助澄清我提出的有關創建肥皂身體的問題,根據webmethod的論點? – 2009-11-09 06:13:52

相關問題