【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>







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM