这几天在学习RESTful WCF 感觉调用起来比较舒服,就是不能在vs里面直接生成类了。。。
首先是RESTful WCF的构建

.svc 后面要加上

Factory="System.ServiceModel.Activation.WebServiceHostFactory

先是接口文件:

[ServiceContract]
public interface ITestWCF
{
    [OperationContract]
    [WebGet(ResponseFormat = Webmessageformat.Json,UriTemplate = "DoWork")]
    bool DoWork();

    [OperationContract]
    [WebInvoke(ResponseFormat = Webmessageformat.Json,BodyStyle = WebMessageBodyStyle.Wrapped,UriTemplate = "WebInvokeWithNoArgs",Method = "POST")]
    ReturnObj WebInvokeWithNoArgs();

    [OperationContract]
    [WebInvoke(ResponseFormat = Webmessageformat.Json,RequestFormat =Webmessageformat.Json,BodyStyle =WebMessageBodyStyle.WrappedRequest,UriTemplate = "WebInvokeWithArgs",Method = "POST")]
    ReturnObj WebInvokeWithArgs(string str);

    [OperationContract]
    [WebGet(ResponseFormat = Webmessageformat.Json,RequestFormat = Webmessageformat.Json,UriTemplate = "WebGetWithNoArgs")]
    ReturnObj WebGetWithNoArgs();

    [OperationContract]
    [WebGet(ResponseFormat = Webmessageformat.Json,UriTemplate = "WebGetWithArgs/{str}")]
    ReturnObj WebGetWithArgs(string str);
}

然后是实现文件

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class TestWCF : ITestWCF
{
    public bool DoWork()
    {
        return true;
    }

    public ReturnObj WebGetWithArgs(string str)
    {
        return new ReturnObj(str);
    }

    public ReturnObj WebGetWithNoArgs()
    {
        return new ReturnObj("Get Success!");
    }

    public ReturnObj WebInvokeWithArgs(string str)
    {
        return new ReturnObj(str);
    }

    public ReturnObj WebInvokeWithNoArgs()
    {
        return new ReturnObj("Invoke Success!");
    }
}

解释一下
WebInvoke 跟WebGet的区别可以理解为 一个是POST,一个是GET。但是WebInvoke的Method也可以为GET,WebGet只能是Get
ResponseFormat = Webmessageformat.Json 这个就是Response的时候采用Json的方式
UriTemplate 这个可以理解一个地址 比如 UriTemplate = “WebInvokeWithNoArgs” 你可以用 http://xxx.xxx.xxx/xxx.svc/WebInvokeWithNoArgs 来进行访问。
当Method为GET,且有参数的时候,可以采用UriTemplate =“方法地址/{参数}/{参数}”的方式来向WCF传递参数。当然,POST还是老老实实写Json吧~
BodyStyle =WebMessageBodyStyle.WrappedRequest 这个为包装Request,这个笔者也没有弄清具体的功能,只是没有这句话的时候 ajax返回的 status为200 加上就好了。。。
BodyStyle = WebMessageBodyStyle.WrappedResponse 这个为包装Response,就是在ajax得到Json的时候会有{“WebInvokeWithNoArgsResult”:{“str”:”Invoke Success!”}}(有) {“str”:”Invoke Success!”}(无)
WebMessageBodyStyle还有两个就是Bare和Wrapped。Bare是全不包装,Wrapped是两个都包装。

然后是传送的类:

[DataContract]
public class ReturnObj
{
    [DataMember(Order = 0)]
    public string str;
    public ReturnObj(string args)
    {
        str = args;
    }
}

如果想要在json中加入一个字段 就用 DataMember 来标记。如果不加DataMember,json中是看不见这个字段的!而且是否可见跟private public无关。
Order为转换为json的时候,字段的顺序。当有Order的时候,小的在前面

[DataMember(Order = 0)]
    private string str;
    [DataMember(Order = 1)]
    public int num;
    [DataMember(Order = 2)]
    public bool ok;

结果就是{“str”:”Invoke Success!”,”num”:1,”ok”:true}
然后貌似不加Order的在加Order的前面(这个不确定,做了几次试验貌似是这样)

如果是基本类型(比如bool什么的)而且没有选择包装Response的时候就是单纯的值,并没有json格式

然后是配置文件

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="TestWCFBehavior"></behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
      <service name="TestWCF">
        <endpoint address="" behaviorConfiguration="TestWCFBehavior" binding="webHttpBinding" contract="ITestWCF"></endpoint>
      </service>
    </services>
  </system.serviceModel>

配置文件一定要认真的检查有没有漏的,因为配置文件写错了不是服务直接挂了就是访问不到。。。

然后是如何用Ajax调用WCF了。。。
如果用jQuery的话,就是$.ajax()
POST:

$.ajax({
            url: "../TestWCF.svc/WebInvokeWithArgs",type: "POST",contentType: "text/json",asnyc: "false",data: '{"str":"Invoke Test"}',dataType: 'json',success: function (resultObj) {
                var resultStr = String(JSON.stringify(resultObj));
                alert(resultStr);
            },error: function (XMLHttpRequest,textStatus,errorThrown) {
                alert(XMLHttpRequest.status);
                alert(XMLHttpRequest.readyState);
                alert(textStatus);
            }
        });

GET

$.ajax({
            url: "TestWCF.svc/WebGetWithArgs/Get Test",type: "Get",asnyc: false,errorThrown) {
                alert(XMLHttpRequest.status);
                alert(XMLHttpRequest.readyState);
                alert(textStatus);
            }
        });

注意url这三个字母不能大写-_-||

如果手写ajax的话

<script type="text/javascript"> var xmlHttp; //下面这个函数根据是否为IE浏览器来生成不同ajax对象 function createxmlHttpRequest() { if (window.ActiveXObject) { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } else if (window.XMLHttpRequest) { xmlHttp = new XMLHttpRequest(); } } //POST function doPost() { var url = "TestWCF.svc/WebInvokeWithArgs"; var data = '{"str":"Invoke Test"}';//注意为json格式 createxmlHttpRequest(); xmlHttp.open("POST",url,false);//open(方法,地址,同步) xmlHttp.setRequestHeader("Content-Type","text/json"); xmlHttp.onreadystatechange = function () { if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) { alert(xmlHttp.responseText); } else { alert(xmlHttp.status); } } xmlHttp.send(data); return false; } //GET function doGet() { var url = "TestWCF.svc/WebGetWithNoArgs"; createxmlHttpRequest(); xmlHttp.onreadystatechange = function () { if ((xmlHttp.readyState == 4) && (xmlHttp.status == 200)) { alert(xmlHttp.responseText); } else { alert(xmlHttp.status); } } xmlHttp.open("GET",false); xmlHttp.send(""); return false; } </script>

注意先设置onreadystatechange 的处理函数再send就行了~

至于在C#客户端那面就可以用WebHttpRequest和WebHttpResponse来处理
GET

static void Main(string[] args)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:65143/testwcf.svc/WebGetWithNoArgs");
            req.Method = "GET";
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            Console.WriteLine(sr.ReadToEnd());

        }

POST

static void Main(string[] args)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://localhost:65143/testwcf.svc/WebInvokeWithArgs");
            req.Method = "POST";
            req.ContentType = "application/json";
            string data = @"{""str"":""From C#""}";
            byte[] SendData = Encoding.Default.GetBytes(data);
            req.ContentLength = SendData.Length;
            req.GetRequestStream().Write(SendData,0,SendData.Length);
            req.GetRequestStream().Close();
            HttpWebResponse res = (HttpWebResponse)req.GetResponse();
            StreamReader sr = new StreamReader(res.GetResponseStream());
            Console.WriteLine(sr.ReadToEnd());

        }

Ajax调用RESTful WCF的更多相关文章

  1. ios – 如何使用Objective C类中的多个参数调用Swift函数?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  2. ios – Swift:递归值类型

    我有一个结构,我想要一个结构类型的全局变量?这个例子本质上是我实际创建的结构的简化版本.但是,它会抛出错误:有没有办法解决这个问题?

  3. 如何防止其他iOS / Android应用程序使用我的RESTful API?

    我有一个预先存在的iOS&Android应用程序,我正在进行更新,包括RESTful服务API和用于身份验证的Facebook登录.该应用程序的一般流程是:>用户通过Facebook的SDK“登录”到我的应用程序,该SDK将访问令牌返回到我的应用程序.>App调用RESTful服务,包括Facebook访问令牌作为参数(使用HTTPS和SSL)>被呼叫的服务将收到的访问令牌(以及仅存储在我的服务器

  4. 使用IOS进行身份验证的Restful API调用

    我正在使用prestashopAPI使用restfulAPI调用的应用程序.我是IOS的新手我在android中编写了相同的方法:它适用于Android.对于IOS,我使用了这种编码,但我没有从服务器获取数据.请告诉我我做错了什么并提供任何解决方案.谢谢!解决方法您可以通过这种方式构建URL字符串,它应该可以工作:–我不相信使用HTTP头字段

  5. 应用程序关闭时的iOS任务

    我正在构建一个应用程序,通过ajax将文件上传到服务器.问题是用户很可能有时不会有互联网连接,并且客户希望在用户重新连接时安排ajax调用.这可能是用户在离线时安排文件上传并关闭应用程序.应用程序关闭时可以进行ajax调用吗?

  6. Swift疑点解决2

    关于Swift中的String类型,String是一个结构体类型包含字符串的unicode但是长度没法算,同样没有length方法。因为Nsstring是OC中的类型,但是苹果工程师做了很好的兼容。还有Swift里一下非常好的方法如varops3=ops.map{$0.description}

  7. 玩转swift字符串——Advanced

    最近在尝试学一些iOSswift开发,要做一个“四则运算计算器”,其中涉及到很多字符串运算,终于在不断查阅文档和stackoverflow的情况下完成。inreverse){printlneachChar}字符串拼接//拼接字符串型str+="Hello"//拼接非字符串型varchCharacter="!"))字符串分割varstr6"welcometoplayswift"//以空格作为分割依据str6.componentsSeparatedByString"")varstr7"welcometopla

  8. Swift利用闭包反向传值

    写个Demo来用闭包实现下控制器反向传值界面十分简单,点击按钮进入第二个控制器,在textfield中输入文字后返回,主页面的label文字便自动更改。首先按照开发逻辑实现第二个控制器的闭包函数:定义个闭包类型,需要传递的参数为String而且注意返回值是Void然后就是声明一个方法用来保存传入的闭包,并且在将要退出控制器的时候传出textfield的文字:回到第一个控制器,在prepareForSegue方法中获得第二个控制器然后执行刚写的方法:大功告成~~

  9. Swift快速入门二基本数据类型

    相关文章Swift快速入门(一)第一个Swift程序1.变量和常量声明常量和变量Swfit是强类型的语言,Swift要求所有的变量和常量必须先声明后使用。就像Swift的其他类型一样,整数类型采用大写命名法。此外Swift还支持对无符号整数的支持。整数数值表现形式Swift整数数值有4种表示方式:十进制:默认的就是十进制整数。Swift提供了两种有符号浮点数类型:Double表示64位浮点数。

  10. swift 02 基本数据类型

    就像Swift的其他类型一样,整数类型采用大写命名法。此外Swift还支持对无符号整数的支持。整数数值表现形式Swift整数数值有4种表示方式:十进制:默认的就是十进制整数。Swift提供了两种有符号浮点数类型:Double表示64位浮点数。

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部