以下是契约层接口:
namespace Valor.ValorCom.Contracts
{[ServiceContract(Name = "NAVService", Namespace = "www.valorcomm.com")]public interface INAVService{/// <summary>
/// 添加订单
/// </summary>
/// <param name="orderId">订单号</param>
/// <returns></returns>
[WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
string AddOrderForNAV(int orderId);}}
第一点要注意的:指定服务可以通过GET方式调用,设置请求和响应的格式都是JSON.
以下是服务类:
namespace Valor.ValorCom.Services
{[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)][JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")]
public class NAVService : INAVService{public NAVService()
{}/// <summary>
/// 添加订单
/// </summary>
/// <param name="orderId">订单号</param>
/// <returns></returns>
public string AddOrderForNAV(int orderId){string result = "";
if (Common.TurnNav())
{//添加订单相关代码
}else
{result = "未开启与NAV系统同步订单的接口";
}return result;
}}}
第二点要注意的,一定要加上[JavascriptCallbackBehavior(UrlParameterName = "jsoncallback")],为javascript回调使用,UrlParameterName 设置用于跨域脚本访问的 URL 查询字符串参数名称。[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 用于asp.net管道兼容,这样的话此服务可以通过jquery ajax跨域调用,asp.net程序也可以通过生成此服务的代理来调用.
以下是配置文件信息
<?xml version="1.0"?><configuration><system.web><compilation debug="true"/></system.web><appSettings></appSettings><system.serviceModel><behaviors><endpointBehaviors><behavior name="webBehavior"><!--这里必须设置-->
<!--<webHttp />-->
<enableWebScript /></behavior></endpointBehaviors><serviceBehaviors><behavior name="navMetadataBehavior"><serviceMetadata httpGetEnabled="true" httpGetUrl="http://wcf.9valor.com/NAVService.svc/metadata"/></behavior></serviceBehaviors></behaviors><services><service behaviorConfiguration="navMetadataBehavior" name="Valor.ValorCom.Services.NAVService"><endpoint binding="webHttpBinding" address="http://127.0.0.1:90/NAVService/web" behaviorConfiguration="webBehavior" bindingConfiguration="webBinding" contract="Valor.ValorCom.Contracts.INAVService" /><endpoint address="http://127.0.0.1:90/NAVService" binding="basicHttpBinding" contract="Valor.ValorCom.Contracts.INAVService"></endpoint></service></services><bindings><webHttpBinding><binding name="webBinding" crossDomainScriptAccessEnabled="true"></binding></webHttpBinding></bindings><serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true"><baseAddressPrefixFilters><add prefix="string"/></baseAddressPrefixFilters></serviceHostingEnvironment></system.serviceModel><startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
第三点注意:
<service behaviorConfiguration="navMetadataBehavior" name="Valor.ValorCom.Services.NAVService"><endpoint binding="webHttpBinding" address="http://127.0.0.1:90/NAVService/web" behaviorConfiguration="webBehavior" bindingConfiguration="webBinding" contract="Valor.ValorCom.Contracts.INAVService" /><endpoint address="http://127.0.0.1:90/NAVService" binding="basicHttpBinding" contract="Valor.ValorCom.Contracts.INAVService"></endpoint></service>
这里配置了两上终结点,第一个终结点的配置给jquery ajax以web的形式调用该服务,指定该终结点的绑定为webHttpBinding,我们看下behaviorConfiguration的配置,
behaviorConfiguration="webBehavior",如下图配置,<enableWebScript /> 配置指定允许web脚本访问。
<endpointBehaviors><behavior name="webBehavior"><!--这里必须设置-->
<!--<webHttp />-->
<enableWebScript /></behavior></endpointBehaviors>
接下来我们再看下bindingConfiguration的配置,bindingConfiguration="webBinding",详细配置如下图,crossDomainScriptAccessEnabled指定脚本可以跨域访问.
<webHttpBinding><binding name="webBinding" crossDomainScriptAccessEnabled="true"></binding></webHttpBinding>
第二个终结点的配置提供给asp.net通过服务代理的方式调用.
最后就是客户端调用(注:GET方式在各浏览器下都正常,POST方式只有在IE下能通过,其它浏览器因为安全原因拒绝跨域POST提交)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head runat="server"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><title></title><link href="~/Styles/Site.css" rel="stylesheet" type="text/css" /><script type="text/javascript" src="Scripts/jquery-1.4.1.min.js"></script><script type="text/javascript">$(function () {$("#btnExcute").click(function () {var url = $("#txtServiceUrl").val();url += "&orderId="+$("#txtOrderId").val();$.ajax({type: "get",dataType: "json",url: url,success: function (returndata) {alert(returndata);}});});});</script></head><body><h2>修改单个产品</h2><p>Wcf Service Url:<input type="text" style="width: 700px;" id="txtServiceUrl" name="txtServiceUrl"value="http://127.0.0.1:90/AspNavService/web/AddOrderForNAV?jsoncallback=?" /></p><p>Order Id:<input type="text" id="txtOrderId" name="txtOrderId" value="11665369" /><br /><input type="button" id="btnExcute" name="btnExcute" value="修改" /></p></body></html>