在本文中,将探讨如何从jQuery客户端代码调用Windows Communication Foundation (WCF) 服务,并指出了需要注意的特殊事项。在开始阅读和遵循本文之前,请先阅读这篇博客文章,该文章描述了如何创建WCF服务:。
一旦完成了WCF服务的创建,需要在服务器类型类上指定属性,以实现ASP.NET兼容性模式。这样,WCF服务就可以像普通的ASMX服务一样工作,并支持所有现有的ASP.NET功能。通过设置兼容性模式,WCF服务将需要托管在IIS上,并使用HTTP与其客户端应用程序通信。
以下是设置ASP.NET兼容性模式的代码示例:
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service : IService
{
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
}
public string[] GetUser(string Id)
{
return new User().GetUser(Convert.ToInt32(Id));
}
}
在上述代码中,定义了一个名为Service的类,它实现了IService接口,并重写了GetData和GetUser方法。
接下来,需要在服务契约文件中为每个方法或操作指定操作级别的属性。为此,请使用WebInvoke属性来标记服务操作,这表明该操作响应除GET之外的HTTP请求。
[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
string[] GetUser(string Id);
在上述代码中,为GetUser方法添加了OperationContract和WebInvoke属性。其中,Method属性设置为POST,表示数据将通过POST方法发送到服务。ResponseFormat属性设置为WebMessageFormat.Json,表示数据将以JSON格式返回。
需要修改Visual Studio为WCF服务创建的默认配置文件Web.Config,以便它能够使用jQuery客户端代码发送的HTTP协议请求。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="EndpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="ServiceBehavior" name="Service">
<endpoint address="" binding="webHttpBinding" contract="IService" behaviorConfiguration="EndpBehavior" />
</service>
</services>
</system.serviceModel>
在上述配置文件中,修改了EndPoint设置,并添加了EndPointBehaviors以支持WEBHTTP请求。
要使用jQuery调用Web服务,即调用WCF服务,可以使用jQuery.ajax()或jQuery.getJSON()。在本文中,使用了jQuery.ajax()方法。
<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";
var ProcessData = true;
CallService();
}
function CallService() {
$.ajax({
type: Type,
url: Url,
data: Data,
contentType: ContentType,
dataType: DataType,
processData: ProcessData,
success: function(msg) {
ServiceSucceeded(msg);
},
error: ServiceFailed
});
}
function ServiceFailed(result) {
alert("Service call failed: " + result.status + " " + result.statusText);
Type = null;
var Url = null;
Data = null;
ContentType = null;
DataType = null;
ProcessData = null;
}
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>