Jquery Ajax访问WCF服务和跨域访问WCF

 代码如下 复制代码

using jquery ajax call wcf service get/post/put/delete
http://www.codeproject.com/Articles/254714/Implement-CRUD-operations-using-RESTful-WCF-Servic
Using POST Method
Retrieve a representation of the addressed member of the collection, in the example below, create a new entry in the collection.
Collapse | Copy Code
$.ajax({
type: "POST",
url: "Services/EFService.svc/Members/",
data: "{Email:'test@test.com', ScreenName:'TestUser'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) { // Play with response returned in JSON format },
error: function (msg) {
alert(msg);
}
}); Using PUT Method
Update the entire collection with another collection, in the example below, update the addressed member of the collection.
Collapse | Copy Code
$.ajax({
type: "PUT",
url: "Services/EFService.svc/Members/",
data: "{Email:'test@test.com', ScreenName:'TestUser'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) { // Play with response returned in JSON format },
error: function (msg) {
alert(msg);
}
});Using DELETE Method
Delete the entire collection or a specific collection, in the example below, delete Member with id=1.
Collapse | Copy Code
$.ajax({
type: "DELETE",
url: "Services/EFService.svc/Members(1)",
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) { // Play with response returned in JSON format },
error: function (msg) {
alert(msg);
}
});

jQuery ajax跨域调用WCF服务

以下是契约层接口:

 代码如下 复制代码

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://www.111cn.net/n96/ 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>

时间: 2024-10-25 23:37:44

Jquery Ajax访问WCF服务和跨域访问WCF的相关文章

再说ExtJs与WCF之间的跨域访问

在前面文章ExtJs与WCF之间的跨域访问已经通过服务端代理的方式解决了 ExtJs与WCF跨域访问的问题,那个方案看起来并不怎么优雅,而当我在写过用 Restful方式调用WCF进行上传下载后,愕然发现原来WCF支持原生数据(Raw)的返 回,这就解决了ExtJs与Wcf之间进行跨域调用中的难题:返回数据必须满足 <script>格式.下面根据ExtJs与WCF之间的跨域访问中实现的项目,通过 Stream和ContentType的联合使用,返回原生数据给Extjs,从而实现跨域调用. 第一

ExtJs与WCF之间的跨域访问

在上一篇文章<<ExtJs+WCF+LINQ实现分页Grid>>中用ExtJs与Wcf交互实现了分页Grid,回复中心有灵犀同学希望能采用跨域访问的方式,这个问题其实也困扰了我很久,本来ExtJS用ScriptTagProxy支持跨域访问的,如果服务端是.aspx的页面文件,也非常好实现,但换作WCF,问题就复杂起来.本文尝试解决这个问题,方案不是很巧妙,但是我对多种方案实验中第一个且是唯一有效的办法. 首先看一下如何用ExtJs中的ScriptTagProxy跨域访问服务器.as

jquery解决客户端跨域访问问题_jquery

客户端"跨域访问"一直是一个头疼的问题,好在有jQuery帮忙,从jQuery-1.2以后跨域问题便迎刃而解.由于自己在项目中遇到跨域问题,借此机会对跨域问题来刨根问底,查阅了相关资料和自己的实践,算是解决了跨域问题.便记录下来,以供查阅.  jQuery.ajax()支持get方式的跨域,这其实是采用jsonp的方式来完成的.  真实案例: 复制代码 代码如下:    $.ajax({             async:false,             url: 'http:/

用jQuery与JSONP轻松解决跨域访问的问题_jquery

时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的,所以通过本机服务器端通过类似httpclient方式完成"跨域访问"的工作,然后在浏览器端用AJAX获取本机服务器端"跨域访问"对应的url.来间接完成跨域访问也是可以的

jQuery 跨域访问解决原理案例详解_jquery

浏览器端跨域访问一直是个问题,多数研发人员对待js的态度都是好了伤疤忘了疼,所以病发的时候,时不时地都要疼上一疼.记得很久以前使用iframe 加script domain 声明.yahoo js util 的方式解决二级域名跨域访问的问题. 时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了.好在,有jQuery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题...有必要记下来备忘, 跨域的安全限制都是指浏览

jQuery 跨域访问问题解决方法_jquery

时间过得好快,又被拉回js战场时, 跨域问题这个伤疤又开疼了. 好在,有jquery帮忙,跨域问题似乎没那么难缠了.这次也借此机会对跨域问题来给刨根问底,结合实际的开发项目,查阅了相关资料,算是解决了跨域问题..有必要记下来备忘. 跨域的安全限制都是指浏览器端来说的.服务器端是不存在跨域安全限制的, 所以通过本机服务器端通过类似httpclient方式完成"跨域访问"的工作,然后在浏览器端用AJAX获取本机服务器端"跨域访问"对应的url.来间接完成跨域访问也是可以

tomcat 下配置ajax 跨域 访问

CORS介绍    它在维基百科上的定义是:跨域资源共享(CORS )是一种网络浏览器的技术规范,它为Web服务器定义了一种方式,允许网页从不同的域访问其资源.而这种访问是被同源策略所禁止的.CORS系统定义了一种浏览器和服务器交互的方式来确定是否允许跨域请求. 它是一个妥协,有更大的灵活性,但比起简单地允许所有这些的要求来说更加安全.    而W3C的官方文档目前还是工作草案,但是正在朝着W3C推荐的方向前进.    简言之,CORS就是为了让AJAX可以实现可控的跨域访问而生的. Tomca

跨域访问代理API-yahooapis

你是否遇到了想利用AJAX访问一些公网API,但是你又不想建立自己的代理服务,因为有时我根本就没打算涉及服务端任何代 码,但是讨厌的浏览器的三原策略,阻止了我们的ajax调用. 比如我想访问一个天气的restfull api,如果我直接去GET : $.get("http://m.weather.com.cn/data/101010100.html"); 看见这问题相信大家都不会陌生,也会很自然的得到解决方案,但是我这里真的不想touch任何服务端代码,用jsonp吧,但 是服务端没实

Web安全技术之浏览器的跨域访问

 一.浏览器介绍 对于Web应用来说,浏览器是最重要的客户端. 目前浏览器五花八门多得不得了,除了Chrome.IE.Firefox.Safari.Opera这些国外的浏览器外,百度.腾讯.360.淘宝.搜狗.傲游之类的,反正能做的都做了. 浏览器虽然这么多,但浏览器内核主要就以下4种: Trident:IE使用的内核. Gecko:Firefox使用的内核. WebKit:Safair和Chrome使用的内核.WebKit由苹果发明,Chrome也用了,但是Google又开发了V8引擎替换掉了