【发布时间】:2017-11-29 12:12:24
【问题描述】:
我正在尝试使用 jQuery 从 ajax 调用中调用 WCF 服务。 我设法从 SOAP-UI 和 Excel/VBA 调用 WCF。 我的问题来自已发送的 OPTIONS 请求并且没有 POST 跟随:
- 如果我将 URL 设置为
http://mywcf/service.svc,则会发送 OPTIONS,我会收到400 Bad Request状态,但不会发送 POST 请求。在这种情况下,标头中缺少HTTP/1.1(与 SOAP-UI 标头相比)。 - 如果我将 URL 设置为
http://mywcf/service.svc HTTP/1.1,则会发送 OPTIONS 并且我会收到200 OK状态,但不会发送 POST 请求。在这种情况下,HTTP/1.1似乎被解释为文件名。
谁能告诉我如何从 javascript 调用 WCF 上的 POST 操作并添加 HTTP/1.1 标头而不破坏服务 URL?
这是我的 ajax 调用的摘录:
var soapData = ''
+'<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:mic="http://microsoft.wcf.documentation">'
+' <soap:Header xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:wsrm="http://docs.oasis-open.org/ws-rx/wsrm/200702">'
+' <wsrm:Sequence>'
+' <wsrm:Identifier>s:Sender a:ActionNotSupported</wsrm:Identifier>'
+' <wsrm:MessageNumber>1</wsrm:MessageNumber>'
+' </wsrm:Sequence>'
+' <wsa:Action>http://schemas.xmlsoap.org/ws/2005/02/rm/CreateSequence</wsa:Action>'
+' <wsa:ReplyTo>'
+' <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>'
+' </wsa:ReplyTo>'
+' <wsa:MessageID>uuid:'+ MsgUid +'</wsa:MessageID>'
+' <wsa:To>'+ Url +'</wsa:To>'
+' </soap:Header>'
+' <soap:Body xmlns:wsrm="http://schemas.xmlsoap.org/ws/2005/02/rm">'
+' <wsrm:CreateSequence>'
+' <wsrm:AcksTo xmlns:wsa="http://www.w3.org/2005/08/addressing">'
+' <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>'
+' </wsrm:AcksTo>'
+' <wsrm:Offer>'
+' <wsrm:Identifier>urn:soapui:'+ SeqUid +'</wsrm:Identifier>'
+' </wsrm:Offer>'
+' </wsrm:CreateSequence>'
+' </soap:Body>'
+'</soap:Envelope>';
$.ajax({
type: 'POST',
url: 'http://mywcf/service.svc', // with or without +' HTTP/1.1'
data: soapData,
contentType: 'application/soap+xml;charset=UTF-8',
dataType: 'xml'
});
我的 WCF 中的值 web.config:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="POST, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="*" />
</customHeaders>
</httpProtocol>
</system.webServer>
【问题讨论】:
-
一个明显的问题是您通话中的网址。您需要在 url 中包含 WCF 方法名称
-
@Sparrow 我设法在不设置方法名称的情况下从 VBA 和 SOAP-UI 调用 WCF。当我在 ajax 调用中添加方法名称时,它似乎被解释为文件名。我不认为这是一个解决方案。
-
请否决票解释他们的选择,谢谢。
-
那么您可能没有在配置文件中正确设置 wcf。你在使用 Visual Studio 吗?如果是,那么我认为您应该使用“WCF 测试客户端”工具并检查它是如何进行调用的。那将是起点。
-
@Sparrow 我真的没有 WCF 开发的权利。因为我可以通过 VBA 和 SOAP-UI 调用 WCF,所以我相信即使使用 OPTIONS 预检也可以使用 AJAX 调用来实现。 “WCF 测试客户端”调用我的 Web 方法失败,但它不是很冗长,所以我不知道会发生什么。
标签: javascript jquery ajax wcf soap