gpt4 book ai didi

javascript - 如何从 javascript 调用 WCF 服务?

转载 作者:数据小太阳 更新时间:2023-10-29 04:47:14 24 4
gpt4 key购买 nike

我正在尝试使用 jQuery 从 ajax 调用中调用 WCF 服务。我设法从 SOAP-UI 和 Excel/VBA 调用 WCF。我的问题来自已发送的 OPTIONS 请求,但后面没有 POST:

  • 如果我将 URL 设置为 http://mywcf/service.svc,则会发送 OPTIONS 并且我会收到 400 Bad Request 状态并且不会发送 POST 请求。在这种情况下, header 中缺少 HTTP/1.1(与 SOAP-UI header 相比)。
  • 如果我将 URL 设置为 http://mywcf/service.svc HTTP/1.1,则会发送 OPTIONS,并且我会收到 200 OK 状态,但不会收到 POST 请求发送。在这种情况下,HTTP/1.1 似乎被解释为文件名。

谁能告诉我如何通过 javascript 在 WCF 上调用 POST 操作并添加 HTTP/1.1 header 而不破坏服务 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>

最佳答案

要使用 jQuery 使用 Web 服务,即调用 WCF 服务,您可以使用 jQuery.ajax() 或 jQuery.getJSON()。在本文中,我使用了 jQuery.ajax() 方法。

要设置请求,首先要定义一个变量。当您调用多个方法并创建不同的 js 文件来调用 WCF 服务时,这将很有帮助。

<script type="text/javascript">

var Type;
var Url;
var Data;
var ContentType;
var DataType;
var ProcessData;

以下函数初始化上面定义的变量以调用服务。

function WCFJSON() {
var userid = "1";
Type = "POST";
Url = "Service.svc/GetUser";
Data = '{"Id": "' + userid + '"}';
ContentType = "application/json; charset=utf-8";
DataType = "json"; varProcessData = true;
CallService();
}

CallService函数通过在$.ajax中设置数据向服务发送请求。

// Function to call WCF  Service       
function CallService() {
$.ajax({
type: Type, //GET or POST or PUT or DELETE verb
url: Url, // Location of the service
data: Data, //Data sent to server
contentType: ContentType, // content type sent to server
dataType: DataType, //Expected data format from server
processdata: ProcessData, //True or False
success: function(msg) {//On Successfull service call
ServiceSucceeded(msg);
},
error: ServiceFailed// When Service call fails
});
}

function ServiceFailed(result) {
alert('Service call failed: ' + result.status + '' + result.statusText);
Type = null;
varUrl = null;
Data = null;
ContentType = null;
DataType = null;
ProcessData = null;
}

注意:以下代码检查 result.GetUserResult 语句,因此您的结果对象获取属性您的服务方法名称 + Result。否则,它会给出类似在 Javascript 中找不到对象的错误。

function ServiceSucceeded(result) {
if (DataType == "json") {
resultObject = result.GetUserResult;

for (i = 0; i < resultObject.length; i++) {
alert(resultObject[i]);
}

}

}

function ServiceFailed(xhr) {
alert(xhr.responseText);

if (xhr.responseText) {
var err = xhr.responseText;
if (err)
error(err);
else
error({ Message: "Unknown server error." })
}

return;
}

$(document).ready(
function() {
WCFJSON();
}
);
</script>

关于javascript - 如何从 javascript 调用 WCF 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44763360/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com