使用 GET 而不是 POST 使用 SOAP 网络服务

Consume SOAP webservice with GET instead of POST

我需要通过 HTTP 调用外部 SOAP 网络服务。
我有 WSDL 文件并通过 'Add service reference' 在 Visual Studio 中添加了它。 Visual studio 然后添加了一些文件,在参考文件中我可以找到这个:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="Service.IService")]
public interface IService {

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService/Function", ReplyAction="http://tempuri.org/IService/FunctionResponse")]
    namespace.Service.ExecuteFunctionResponse ExecuteFunction(namespace.Service.FunctionRequest request);
}

此外还有此调用的异步版本和用于发送接收的对象等

为了调用服务,我添加了以下代码:

BasicHttpBinding binding = new BasicHttpBinding();     
EndpointAddress endpointAddress = new EndpointAddress("the address");
serviceChannel = new ServiceClient(binding, endpointAddress).ChannelFactory.CreateChannel();
Response response = serviceChannel.ExecuteFunction(new Request(...));

这导致我遇到异常,不允许使用错误 405 方法。
所以看来我必须使用 HTTP GET 请求而不是默认的 POST 请求。但是我找不到可以用这种工作方式改变的地方。

那么,我在哪里可以设置此 Web 服务调用的 HTTP 方法?

SOAP 服务正在使用 HTTP POST,因为它们交换 XML 消息(往往很复杂)并且无法在查询字符串中传输。

您确定必须使用 HTTP GET 吗?也许您收到的错误“405 方法不允许”是由某些错误的配置引起的。 我会仔细检查 SOAP 端点 URL 是否设置正确,并检查是否不需要额外的安全要求。

编辑 过去,有一种做法是创建也接受 GET 的 ASP.NET Web 服务。但他们不会期望 XML 消息。相反,您必须在查询字符串中传递所有参数。例如:https://foo.bar/service.asmx/Func?param1=X&param2=Y(其中 param1 和 param2 是预期参数)。

这样就可以在不需要 WSDL 和使用 GET 方法的情况下调用 WebService。例如,您可以使用 HttpClient 来实现它。 这种方法的缺点是您将不得不处理纯数据而不是对象。

希望对您有所帮助。