使用POST而不是通常的WSDL路由来使用web服务
本文关键字:路由 服务 web WSDL POST 使用 | 更新日期: 2023-09-27 18:29:35
这就是我目前使用特定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使用web服务https://address.of.service,以及我如何实际使用C#执行POST?我只想使用POST,在那里我可以使用POST直接向https://address.of.service并将结果作为原始XML数据返回。问题是,原始XML数据是什么?我应该如何使用POST发送它?
(这个问题的目的:我问的原因是我希望使用C#和.NET以外的东西(如Ruby或Mac OS X上的Cocoa)来使用此服务。我根本不知道该怎么做,因为我在其他平台上没有任何易于使用的"svcutil.exe"来为我生成所需的代码。这就是为什么我认为,只要能够使用常规POST使用该服务,我就可以更容易地在其他平台使用该服务。)
现在要做的事情听起来很痛苦,如果服务器发生任何变化,那么要继续做下去也很痛苦。它真的是在重新发明轮子。
如果你还没有考虑过,我会:
(a) 研究是否可以使用服务的元数据,并使用目标平台的本地代理生成器。没有多少平台没有至少一些工具,如果不是全部的话,可能会让你走上一部分路。也许可以转发一个针对Ruby的问题,问他们有什么框架可以使用HTTPS服务,因为它是WSDL?
(b) 如果做不到这一点,如果你的场景允许,我会考虑使用一个用C#编写的代理,它充当服务的门面,将服务转化为更容易使用的东西(例如,你可以使用类似ASP.NET MVC WebAPI的东西,它很灵活,可以很容易地提供符合标准的响应,你可以对其保持完全控制)。
我怀疑其中一个可能会比你目前所走的道路更容易、更有价值。
在将.NET WCF代码移植到其他平台时,我不得不经历类似的事情。我发现最简单的方法是在WCF客户端上启用消息日志记录。这可以被配置为保存信封和正文,一旦一切都在房子的.NET一侧工作,您就可以使用消息日志来获得"已知良好"的XML请求/响应,以便将其端口连接到其他平台。
我发现这种方法更优雅,因为我不必在日志消息中添加额外的行为,而且可以在配置中轻松地启用/禁用/调整它。VisualStudio附带的服务跟踪查看器工具也可以方便地查看日志文件。
我认为,当你说服务应该从其他没有代理类生成逻辑的平台上使用时,你可以使用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的可能性),通过HTTP使用NTLM身份验证可能需要您自己连接起来。为了回答上面的一个问题:auth-creds在哪里?如果服务正在使用NTLM,则身份验证将在HTTP以下的某个层进行。如果服务使用NTLM对HTTP进行身份验证,则NTLM凭据位于HTTP授权标头中。你应该能够用wireshark知道它们在哪里。您可能还需要一个SOAPAction头;这也可以用wireshark进行嗅探。对于C#客户端,我相信有文档解释了如何向您的请求添加头。