C# 使用POST而不是通常的WSDL路径使用web服务

C# 使用POST而不是通常的WSDL路径使用web服务,c#,web-services,http,post,wsdl,C#,Web Services,Http,Post,Wsdl,这就是我目前使用特定Microsoft web服务的方式。请注意,它位于HTTPS服务器上,需要在操作系统的“根证书颁发机构”中安装用户名、密码和.cer文件 我的问题是:我如何获得所有必要的信息,以便使用直接发送到的web服务,以及如何实际使用C#执行发送?我只想使用POST,在这里我可以使用POST直接提供原始XML数据,并将结果作为原始XML数据返回。问题是,原始XML数据是什么,我应该如何使用POST发送它 (这个问题的目的:我问的原因是我希望使用C#和.NET以外的东西(比如Ruby或

这就是我目前使用特定Microsoft web服务的方式。请注意,它位于HTTPS服务器上,需要在操作系统的“根证书颁发机构”中安装用户名、密码和
.cer
文件

我的问题是:我如何获得所有必要的信息,以便使用直接发送到的web服务,以及如何实际使用C#执行发送?我只想使用POST,在这里我可以使用POST直接提供原始XML数据,并将结果作为原始XML数据返回。问题是,原始XML数据是什么,我应该如何使用POST发送它


这个问题的目的:我问的原因是我希望使用C#和.NET以外的东西(比如Ruby或Mac OS X上的Cocoa)来使用这项服务。我不知道该怎么做,因为我没有任何易于使用的“svcuti.exe”在其他平台上为我生成所需的代码。这就是为什么我认为,只要能够使用常规POST使用该服务,我就可以更轻松地在其他平台上使用该服务。)

在将.NET WCF代码移植到其他平台时,我必须经历类似的过程。我发现最简单的方法是启用。这可以配置为保存信封和正文,并且一旦所有内容都在房子的.NET端工作,您就可以使用消息日志将“已知良好”的XML请求/响应发送到其他平台的端口


我发现这种方法更加优雅,因为我不必向日志消息添加额外的行为,而且可以在配置中轻松启用/禁用/调整。VisualStudio附带的还可以方便地查看日志文件。

您现在尝试执行的操作听起来很痛苦,如果服务器发生任何更改,则继续执行下去也很痛苦。它真的在重新发明轮子

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

(a) 研究是否可以使用服务的元数据,并使用目标平台的本地代理生成器。没有多少平台没有至少一些工具可以帮助您完成部分工作(如果不是全部的话)。也许会针对Ruby提出一个问题,询问在给定HTTPS服务的WSDL情况下,存在哪些框架来使用HTTPS服务

(b)失败了,如果您的方案允许,我会考虑使用C语言编写的代理,作为服务的外观,将其转化为更容易使用的服务。(例如,您可以使用类似ASP.NET MVC WebAPI的东西,它非常灵活,可以轻松提供符合标准的响应,您可以对这些响应进行全面控制)


我怀疑其中一个可能会比您目前所走的道路更容易、更有价值。

我认为,当您说应该从其他没有代理类生成逻辑的平台使用该服务时,您可以使用REST服务。这将允许您以简单的字符串连接而不是复杂的字符串连接来创建输入尽管其适用性取决于具体情况

查看此讨论:

关于证书,请参阅如何配置证书

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

我将做什么:

1-创建一个可以在此Web服务上发布的小型c#应用程序(使用svcuti)。并对其进行修改以显示发送/接收的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可能需要您自己连接起来。要回答上面的问题:身份验证凭据在哪里?如果服务在HTTP上使用NTLM,则身份验证将在HTTP下面的某个层进行。如果服务使用NTLM对HTTP进行身份验证,则您的NTLM凭据位于HTTP授权标头中。你应该能够通过wireshark知道它们在哪里。你可能还需要一个SOAPAction头;这也可以通过wireshark进行嗅探。对于C#客户端,我确信有文档解释了如何将头添加到你的请求中。

你是否尝试过像Fiddler这样的工具来检查来回的内容?如果是,你是否尝试过pulli我相信我已经使用这里的说明找到了从服务发送和接收的原始XML:然而,问题是这只是XML数据。它不包含任何HTTPS地址,只包含普通HTTP地址,并且没有任何用户名/密码因此,在我看来,发送和接收的XML数据与实际安全地连接到服务是一个独立的问题。我不知道如何做到这一点。不用担心,它仍然出现在我的收件箱中。至于链接的文章,你是使用了代码,还是你注意到最后他放弃了所有这些,只是继续了Wireshark?如果您选择后者,那么您肯定会看到所有内容(可能太多),包括网络级SSL协商。@dbaseman我只使用了他的代码。我没有注意到他提到Wireshark。我会尽快尝试,看看这是否给了我一些信息。谢谢!@dbaseman I ch
// 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);  

}