使用POST而不是通常的WSDL路由来使用Web服务

时间:2012-04-01 00:20:44

标签: c# web-services http post wsdl

这就是我目前设法使用特定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服务,以及如何实际执行POST用C#?我只想使用POST,我可以使用POST直接向https://address.of.service提供原始XML数据,并将结果作为原始XML数据返回。问题是,什么是原始XML数据以及我应该如何使用POST发送它?

这个问题的目的:我问的原因是我希望使用除C#和.NET之外的其他东西(例如Ruby或Mac OS X上的Cocoa)来使用此服务。我无法知道如何做到这一点,因为我没有任何易于使用的“svcutil.exe”在其他平台上为我生成所需的代码。这就是为什么我认为只是能够使用常规POST来使用服务可以让我更容易地在其他平台上使用该服务。)

5 个答案:

答案 0 :(得分:1)

在将.NET WCF代码移植到其他平台时,我不得不经历类似的事情。我发现最简单的方法是启用message logging on the WCF client。这可以配置为保存信封和正文,一旦所有内容都在内部的.NET端工作,您就可以使用消息日志对其他平台的端口进行“已知良好”的XML请求/响应。

我发现这种方法更优雅,因为我没有必要添加额外的行为来记录消息,并且可以在配置中轻松启用/禁用/调整。 Visual Studio附带的Service Trace Viewer Tool也可以方便地查看日志文件。

答案 1 :(得分:1)

如果服务器发生任何变化,您尝试做的事情现在听起来很痛苦并且难以继续前进。它真的重新发明了轮子。

如果您还没有考虑过,我会:

(a)研究您是否可以使用您拥有的服务元数据,并使用您的目标平台本机代理生成器。没有多少平台没有至少一些工具,如果不是全部的话可能会让你成为一部分。或许重新发布一个针对Ruby民众的问题,询问在给定WSDL的情况下使用HTTPS服务存在哪些框架?

(b)如果你的方案允许,我会考虑使用用C#编写的代理作为服务的外观,将其转换为更容易使用的东西(例如,你可能会使用像ASP这样的东西)。 NET MVC WebAPI,它非常灵活,可以轻松提供符合标准的响应,您可以通过它来维护总体控制。)

我怀疑其中一项可能比你现在的道路更容易,更有价值。

答案 2 :(得分:1)

我认为当你说服务应该从没有代理类生成逻辑的其他平台消费时,你可以使用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了解如何配置证书。

我知道这不是一个非常精确的答案,但你将是评估上述程序的最佳人选,因此发布。希望它有所帮助。

答案 3 :(得分:1)

我会做什么:

1-创建一个可以在此Web服务上发布的小型c#应用程序(使用svcutil)。并修改它以显示XML发送/接收。要查看xml,有几种方法:logging,wireshark等。要将它直接添加到小应用程序,还有另一个问题here可以给出一个很好的答案。

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);  

}

答案 4 :(得分:1)

我不是.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#客户端,我确信有文档说明如何为您的请求添加标题。