我在SharePoint 2010中创建了一个自定义WCF服务,我正在尝试通过JQuery Ajax请求调用该服务。我的自定义 WCF 服务以此处给出的示例为模型:
链接: http://blog.sharepointbits.com/2010/04/custom-wcf-services-in-sharepoint-2010_17.html
上面的方法为我提供了一个可以从 C# 服务器端代码访问的 WCF 服务和一个自定义 InfoPath 表单,但是,我无法使用 JQuery Ajax 获得响应。
我在其他地方读到堆栈溢出使用MultipleBaseAddressWebServiceHostFactory
而不是原始文章建议的MultipleBaseAddressBasicHttpBindingServiceHostFactory
。
链接:Sharepoint 2010 WCF 服务。 使用 jquery 调用方法
这奏效了,允许我通过 JQuery Ajax 联系(但不进行身份验证)服务,但是,
a) 我无法再导航到 http://[servername]/_vti_bin/Service.svc/mex 并看到 WSDL。此问题意味着我的 InfoPath 表单也无法连接到该服务,因为它们要查找 WSDL。
b) 即使 JQuery Ajax 请求命中自定义 WCF 服务,浏览器每次都会要求我进行身份验证,即使请求来自登录到 SharePoint 的用户的浏览器。
如果有人知道如何解决问题a)和b)我将不胜感激。制作可以从任何应用程序使用的服务真的不应该那么困难。
经过一番胡思乱想,我坚持使用MultipleBaseAddressBasicHttpBindingServiceHostFactory
。我没有尝试通过 JSON 联系 WCF 服务,而是创建了一个函数来创建 SOAP 消息,将其发送到 WCF 服务,然后分析结果。
有趣的是,这似乎也解决了我的身份验证问题,尽管我不清楚为什么。
现在,该服务可以从InfoPath和JavaScript使用。
作为参考,从 JavaScript 到 WCF 的 SOAP 消息应如下所示:
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<soap:Body>
<MethodName xmlns="http://tempuri.org/">
<ParamName1>Value</ParamName1>
<ParamName2>Value</ParamName2>
</MethodName>
</soap:Body>
</soap:Envelope>
和JQuery发送它:
$.ajax({
type: "POST",
url: url,
data: soapEnvelope,
timeout: timeOut,
contentType: "text/xml",
dataType: "xml",
beforeSend: function (xhr) {
xhr.setRequestHeader("SOAPAction", 'http://tempuri.org/' + methodPath);
},
success: onSuccess,
error: onFailure
});
注意:找出 methodPath 的值应该是什么的最简单方法是查看服务的 WSDL。