簡體   English   中英

使用POST而不是通常的WSDL路由來使用Web服務

[英]Consuming a web service using POST instead of the going the usual WSDL route

這就是我目前設法使用特定Microsoft Web服務的方式。 請注意,它位於HTTPS服務器上,並且需要在操作系統的“根證書頒發機構”中安裝用戶名,密碼和.cer文件。

WSHttpBinding binding = new WSHttpBinding();

binding.Security.Mode = SecurityMode.TransportWithMessageCredential;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.Security.Message.NegotiateServiceCredential = true;
binding.Security.Message.AlgorithmSuite
  = System.ServiceModel.Security.SecurityAlgorithmSuite.Default;
binding.Security.Message.EstablishSecurityContext = true;

EndpointAddress endpoint = new EndpointAddress("https://address.of.service");

//"GreatClient" was created for me automatically by running
//"svcutil.exe https://address.of.service?wsdl"
GreatClient client = new GreatClient(binding, endpoint);

//Username and password for the authentication. Notice that I have also installed
//the required .cer certificate into the system's "root certificate authorities".
client.ClientCredentials.UserName.UserName = "username";
client.ClientCredentials.UserName.Password = "password";

//Now I can start using the client as I wish.

我的問題是:我如何獲得所有必要的信息,以便我可以使用直接POST到https://address.of.service來使用Web服務,以及如何使用C#實際執行POST? 我只想使用POST,我可以使用POST直接向https://address.of.service提供原始XML數據,並將結果作為原始XML數據返回。 問題是,什么是原始XML數據以及我應該如何使用POST發送它?

這個問題的目的:我問的原因是我希望使用除C#和.NET之外的其他東西(例如Ruby或Mac OS X上的Cocoa)來使用此服務。我無法知道如何在地球上這樣做,因為我沒有任何易於使用的“svcutil.exe”在其他平台上為我生成所需的代碼。這就是為什么我認為只是能夠使用常規POST使用該服務將允許我更容易在其他平台上使用該服務。)

如果服務器發生任何變化,你現在嘗試做的事情聽起來很痛苦並且很難保持前進。 它真的重新發明了輪子。

如果您還沒有考慮過,我會:

(a)研究您是否可以使用您擁有的服務元數據,並使用您的目標平台本機代理生成器。 沒有多少平台沒有至少一些工具,如果不是全部的話可能會讓你成為一部分。 或許重新發布一個針對Ruby民眾的問題,詢問在給定WSDL的情況下使用HTTPS服務存在哪些框架?

(b)如果你的方案允許,我會考慮使用用C#編寫的代理作為服務的外觀,將其轉換為更容易使用的東西(例如,你可能會使用像ASP.NET MVC WebAPI這樣的東西)這是靈活的,可以輕松提供符合標准的響應,您可以保持完全控制)。

我懷疑其中一個可能比你現在的道路更容易,也更有價值。

我想當你說服務應該從沒有代理類生成邏輯的其他平台消費時,你可以使用REST服務。 這將允許您將輸入創建為簡單的字符串連接而不是復雜的XML。 雖然它的適用性取決於具體情況。

請查看此討論: http//social.msdn.microsoft.com/Forums/en-US/wcf/thread/6907d765-7d4c-48e8-9e29-3ac5b4b9c405/

就證書而言,請參閱http://msdn.microsoft.com/en-us/library/ms733791.aspx以了解如何配置它。

我知道這不是一個非常精確的答案,但你將是評估上述程序的最佳人選,因此發布。 希望能幫助到你。

我會做什么的:

1-創建一個可以在此Web服務上發布的小型c#應用程序(使用svcutil)。 並修改它以顯示XML發送/接收。 查看XML有幾種方法:記錄,Wireshark的等要直接將其添加到小應用程序有一個問題在這里 ,讓一個很好的答案。

2-一旦你知道你要發送什么,就可以在c#中這樣做:

// implement GetXmlString() to return the XML to post
string xml = GetXmlString();


// create the url
string url = new UriBuilder("http","address.of.service",80).ToString();     


// create a client object
using(System.Net.WebClient client = new System.Net.WebClient()) {
    // performs an HTTP POST
    client.UploadString(url, xml);  

}

我不是.NET程序員,但我必須與一些.NET服務進行互操作,並擁有大量的SOAP / WSDL經驗。 聽起來你已經為你的服務捕獲了XML。 您將面臨的另一個問題是身份驗證。 OOTB,.NET Web服務使用NTLM進行身份驗證。 對NTLMv2的開源語言支持可能會受到影響(盡管快速谷歌搜索為ruby提供了一些可能性),並且使用NTLM auth over HTTP可能是您必須自己連接在一起的東西。 回答上面的問題:auth creds在哪里? 如果服務通過線路使用NTLM,則在HTTP下面的某個層發生身份驗證。 如果服務使用NTLM來驗證HTTP,則您的NTLM信用在HTTP Authorization標頭中。 你應該能夠告訴wireshark他們在哪里。 你可能也需要一個SOAPAction頭; 這也可以用wireshark嗅到。 對於C#客戶端,我確信有文檔說明如何向您的請求添加標頭。

將.NET WCF代碼移植到其他平台時,我不得不經歷類似的事情。 我發現最簡單的方法是在WCF客戶端上啟用消息日志記錄 這可以配置為保存信封和正文,一旦所有內容都在內部的.NET端工作,您就可以使用消息日志對其他平台的端口進行“已知良好”的XML請求/響應。

我發現這種方法更優雅,因為我沒有必要添加額外的行為來記錄消息,並且可以在配置中輕松啟用/禁用/調整。 Visual Studio附帶的服務跟蹤查看器工具也可用於查看日志文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM