使用GET而不是POST来使用SOAP Web服务

时间:2019-06-13 16:22:41

标签: c# visual-studio web-services soap http-get

我需要通过HTTP调用外部SOAP Web服务。
我有WSDL文件,并通过“添加服务引用”将其添加到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请求。但是我找不到通过这种工作方式可以改变这一点的地方。

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

1 个答案:

答案 0 :(得分:2)

SOAP服务之所以使用HTTP POST,是因为它们交换XML消息(这往往很复杂),并且不能在查询字符串中进行传输。

确定要使用HTTP GET吗?可能是由于某些错误的配置导致您收到“不允许使用405方法”的错误。 我将再次检查SOAP端点URL的设置是否正确,并检查是否不需要其他安全要求。

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

这样,可以无需WSDL并使用GET方法来调用WebService。您可以通过使用HttpClient为例来实现。 这种方法的缺点是您将不得不处理纯数据而不是对象。

我希望它会有所帮助。