[數據共享(干貨)] wcf rest 服務發布數據 以及獲得數據


     最近在做一個項目 ,需要我們做一個東西,我們姑且叫數據共享吧,我們公司叫A公司,對方公司叫B公司,就是A公司提供一個數據服務接口出去,B公司如果想拿我們數據的時候直接調用我們的服務接口就行了,我們同樣要獲取對方B方的數據,直接拿對方的數據,經過協商我們決定采用WCF服務的REST方式進行數據共享,數據格式采用json,POST 方式進行請求

    1,首先就是我們要進行發布我們的數據,如何寫一個WCF REST 服務呢,請看我的這篇文章http://www.cnblogs.com/huchaoheng/p/6379026.html 

1)接口如下:

 [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json,BodyStyle=WebMessageBodyStyle.Wrapped)]
        string GetProductListByCategoryName(string categoryName);

2) 實現接口: 

JsonConvert真的很厲害,可以將json  與object 進行互換
public string GetProductListByCategoryName(string categoryName)
        {
            List<Product> ProductList = Products.Instance.ProductList.Where(t => t.CategoryName == categoryName).ToList();
            var result = JsonConvert.SerializeObject(ProductList);
            return result;
        }

 

    2,如何發布一個WCF服務 呢,我們知道WCF服務可以寄存到IIS 上,其實不止是IIS,現在我們姑且寄存到IIS上去,發布好的程序,啟用32位程序改成True

   3,現在我們的服務已經發布好了,我們該如何進行獲取呢。發布好的程序 點擊URL 如下圖所示:

 

 

1)首先wcf rest  服務相當與一個URL  我們這里如何進行請求一個URL 呢,我們需要用到  HttpWebRequest ,這個怎么用,可以參考  http://www.cnblogs.com/kissdodog/archive/2013/04/06/3002779.html  別人寫的博客,還不錯 我們現在要寫自己的請求URL 的方法 ,這樣就可以輕松的可以獲取到發布服務的json 格式

 

  /// <summary>
        /// huchao 
        /// 數據請求
        /// 2017.2.12
        /// </summary>
        /// <param name="url">wcf rest 請求地址</param>
        /// <param name="parametrds">wcf rest 服務請求參數 此處為json 格式</param>
        /// <returns></returns>
        public string GetResponeDataByPost(string url, string parametrds)
        {
            //進行數據請求
            HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create(url);
            httpRequest.ContentType = "application/json";
            httpRequest.Method = "POST";
            byte[] payload;
            payload = Encoding.UTF8.GetBytes(parametrds);
            httpRequest.ContentLength = payload.Length;
            Stream pRequestStream = httpRequest.GetRequestStream();
            pRequestStream.Write(payload, 0, payload.Length);
            pRequestStream.Close();
            //獲得相應
            HttpWebResponse httpRespone = (HttpWebResponse)httpRequest.GetResponse();
            var myStream = httpRespone.GetResponseStream();
            StreamReader StreamReader = new StreamReader(myStream, Encoding.UTF8);
            var data = StreamReader.ReadToEnd();
            StreamReader.Close();
            myStream.Close();
            return data;
        }

2)下面我們要寫個類進行傳入url  還有我們的參數

  public List<Product> GetObject(string servicesFullUrl, Object ParamInput)
        {
            var ParamInputs = JsonConvert.SerializeObject(ParamInput);

            string s = GetResponeDataByPost(servicesFullUrl, ParamInputs);
          return JsonConvert.DeserializeObject<List<Product>>(s);
            
        }

這樣是否能得到我們想要的結果呢,此處得到的s為下面圖所示:

 

我們調用 JsonConvert.DeserializeObject<List<Product>>(s);  會報錯: 因為上面的得到json 並不能直接反序列化到list  需要我們稍微處理下:參考博客:http://blog.csdn.net/yyixin/article/details/7243472

 /// <summary>
        /// json 反序列化到Dictionary
        /// </summary>
        /// <param name="strJson"></param>
        /// <returns></returns>
        public Dictionary<string, string> JsonToDictionary (string  strJson) 
        {
            JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
            return  jsSerializer.Deserialize<Dictionary<string, string>>(strJson);
        }

3)上面的方法重新寫為

 

 重新輸入參數

GetObject("http://localhost:8011/ProductRESTService.svc/GetProductListByCategoryName", new
{
categoryName = "Category 1",

});

 

然后就可以獲取到發布的數據 此處注意  categoryName  必須和發布的程序的 參數名稱 categoryName 相同,否則數據獲取不到.

 

 

歡迎大家留言,我將第一時間進行回復

 

 

 

 

 

  

 

   


免責聲明!

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



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