【C#】WebService接受跨域请求及返回json数据

问题概述

通过Web Service发布服务供客户端调用是一种非常简单、方便、快速的手段,并且服务发布后会有一个服务说明页面,直观明了,如图:

一般情况下,在web页面中的JavaScript中调用Web Service时,由于上述服务返回的数据是xml格式的,虽然js也能处理
xml,但就是用着不太爽,如果能直接让webService返回json数据,那就再好不过了。
此外,JavaScript访问webService时通常还会遇到跨域的问题,之前有提到过可以使用Jsonp处理,但也是比较麻烦的,需要服务端和客户端同时做好处理。

WebService返回json数据

在Visual Studio中创建WebService的过程此处不再赘述,可参考:http://blog.csdn.net/yexuanbaby/article/details/9029605

默认WebService的方法定义我们是这样写的:

        [WebMethod]

        public string HelloWorld()

        {

            return "Hello World";

        }

这种写法无论我们的返回值是否是json字符串,最终都会被xml包一层,不能直接作为json数据处理的,将返  回类型改为void,return部分改为如下部分:

            Context.Response.Charset = "UTF-8";

            Context.Response.ContentEncoding = System.Text.Encoding.GetEncoding("UTF-8");

            Context.Response.Write(jsonStr);

            Context.Response.End();

其中jsonStr是json字符串,为string类型的数据,这样返回的数据就不再是xml格式的,直接是json数据了。

Tips:关于c#如何将对象转为json字符串,可以使用JavaScriptSerializer 类。

服务端配置搞定跨域问题

关于如何使用Jsonp处理跨域问题,参考:http://www.cnblogs.com/lightmao/p/6083996.html

其实我们在web应用的配置文件web.config中添加以下节点就可以了,可以在Access-Control-Allow-Origin处设置允许跨域访问的域名,*表示接受所有的跨域请求。

<system.webServer>

    <modules runAllManagedModulesForAllRequests="true"/>

    <httpProtocol>

      <customHeaders>

            <add name="Access-Control-Allow-Methods" value="OPTIONS,POST,GET"/>

            <add name="Access-Control-Allow-Headers" value="x-requested-with,content-type"/>

            <add name="Access-Control-Allow-Origin" value="*" />

      </customHeaders>

    </httpProtocol>

  </system.webServer>






原文地址:https://www.cnblogs.com/lightmao/p/7923362.html