【问题标题】:Consume SOAP webservice with GET instead of POST使用 GET 而不是 POST 来使用 SOAP Web 服务
【发布时间】:2019-10-28 07:15:13
【问题描述】:

我需要通过 HTTP 调用外部 SOAP 网络服务。
我有 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 请求。但是我找不到这种工作方式可以改变的地方。

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

【问题讨论】:

  • SOAP 已经非常停产了。您可能应该考虑将其升级到 web api 或 WCF
  • 这是第三方服务,所以恐怕我无能为力。
  • 可能会解释你缺乏回应。我已经有 8 年没有使用 SOAP 了,我以前很了解它,但是……嗯,那是 8 年前的事了 :)

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


【解决方案1】:

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

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

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

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

希望对你有帮助。

【讨论】:

  • 我之前查过它,根据这里的其他问题,这种情况很少见,通常不会完成,但可能并得到 w3c 标准的支持。来源:stackoverflow.com/questions/26339317/… 要发送的数据相当有限,他们提供的调用服务的示例是单个 URL。但是,在查看 wsdl 时,它是一个 SOAP 服务。所以我对整个事情感到困惑。我想我会接受你的建议并联系服务的所有者,看看配置中是否有问题。
  • 您在编辑中使用的方法成功了。奇怪的是我应该如何忽略整个 SOAP 部分,但如果它有效......我会在几个小时内允许我奖励赏金。
  • @kyudosai 你是对的。当以这种方式使用它时,它并不是真正的 SOAP(无 XML)。它更像 REST。我只在 ASP.NET 中遇到过这种情况。很高兴能帮到你:)
  • 您确定所有 SOAP 服务都是基于 POST 的吗?我正在使用一项服务,该服务在其 WSDL 中未提及“POST”选项。我的 POST 方法失败了。
  • @johnywhy 理论上 SOAP 可以在 GET 中实现,但由于 XML 消息往往很复杂和冗长,所以这是不切实际的,而且我个人从未遇到过这样的实现。你能分享更多信息吗?堆栈跟踪,错误消息?
猜你喜欢
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
  • 2010-09-07
  • 1970-01-01
  • 2016-12-25
  • 1970-01-01
相关资源
最近更新 更多