2014-01-29 62 views
0

我正在開發代理WCF服務。所以,我要實現此分配的部分任務是:WCF服務充當外部Web服務的代理

  1. 我要捕捉標題和內容從傳入的請求(從 Web瀏覽器)。
  2. 構建一個具有標題的外部Web服務的Web請求,以及來自請求的內容 。
  3. 執行網絡請求。
  4. 捕獲標頭/ Cookie /內容形成外部網絡 服務的響應。
  5. 構建響應,添加標頭/ cookies並將響應發送回 瀏覽器。

我可以在web和stackoverflow的幫助下管理1,2,3和4。但沒有找到任何解決方案的任務5.

問題:從外部Web服務

  1. 響應消息是JSON。如何將json格式的相同消息發送到Web瀏覽器?
  2. 外部Web服務的響應具有'set-cookie'標頭。如何將此添加到Web瀏覽器響應?

我是WCF和Web服務世界的新手。使用System.Net.Http.HttpClient調用外部Web服務。打開將其更改爲其他任何客戶端庫,實現任務1〜5

代碼塊:

IService1.cs

[OperationContract] 
    [WebInvoke(Method = "POST", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     UriTemplate = "client/api")] 
    string ProxyAPI(Stream inp); 

Service1.cs

public string ProxyAPI(Stream contentStream) 
    { 
     // Task 1: Capture Headers and content 
     // Task 2: Construct web request with headers and content from incoming request 
     HttpClient proxyClient = new HttpClient(); 
     Uri extWSuri = new Uri("http://router.sdc.com:8090/service/api"); 
     proxyClient.BaseAddress = extWSuri; 

     // get input reqquest headers and add to httpclient onject 
     WebOperationContext current = WebOperationContext.Current; 
     WebHeaderCollection headers = current.IncomingRequest.Headers; 
     string[] headerKeys = headers.AllKeys; 
     foreach (string keyStr in headerKeys) 
     { 
      if (keyStr.ToLower().Equals("host")) 
      { 
       proxyClient.DefaultRequestHeaders.Add(keyStr, "router.simplifydc.com:8080"); 
      } 
      else if (!keyStr.ToLower().StartsWith("cont")) 
      { 
       proxyClient.DefaultRequestHeaders.Add(keyStr, headers.GetValues(keyStr)); 
      } 
     } 

     // get input content data 
     StreamReader reader = new StreamReader(contentStream); 
     string contentData = reader.ReadToEnd(); 
     reader.Close(); 

     // create content for httpclient request 
     StringContent contentRequest = new StringContent(contentData, System.Text.Encoding.UTF8, "application/x-www-form-urlencoded"); 

     // Task 3: execute web request 
     Task<HttpResponseMessage> responseTask = proxyClient.PostAsync(extWSuri, contentRequest); 
     responseTask.Wait(); 

     // Task 4: Capture headers/cookies/contnet from web response 
     HttpResponseMessage response = responseTask.Result; 
     HttpResponseHeaders resHeaders = response.Headers; 
     Task<string> contentTask = response.Content.ReadAsStringAsync(); 
     contentTask.Wait(); 
     string responseMsg = contentTask.Result; 

     // Task 5: construct response for incoming web browser request 
     // ????????????? 
     return responseMsg; 
    } 

回答

0

如果我得到它是正確的,您的WCF服務的客戶端應用程序是一個網絡瀏覽器。這意味着它期望一個HTML文檔作爲迴應權?在這種情況下,我建議避免使用WCF服務。

爲什麼不使用ASP.NET頁面它構成了HTML返回?在你的ASP.NET代碼後面,你可以執行你描述的4個步驟。在第5步中,您將調整HTML以包含您從外部Web服務獲得的前幾步中獲得的數據。

你總是可以使用WCF服務構建HTML響應,但我看不出爲什麼。您可以使用HTML DOM解析器(如this以編程方式構建HTML響應,但這不會是我的第一種方法。)

如果您的頁面需要純數據而非HTML,則WCF服務可能會以JSON格式返回數據。正如你所看到的,JSON是一個簡單的字符串,它可以很容易地構建,它取決於你想要返回的數據,但是它可以很容易地手動實現,或者使用一些特定的庫如Json.NET。會解析JSON並相應地顯示數據。

希望我幫了忙!

+0

是的,客戶端是一個網頁瀏覽器。這背後的實際情況是,我們有一個既有前端用戶界面又有api服務的現有服務。現在我們正在將前端用戶界面用於新服務,並保持api服務不變。所以新的前端服務需要與api服務交談以獲取數據以顯示給用戶。我們必須在不對前端UI代碼庫和API服務進行更改的情況下實現此目的。所以爲了實現這一點,我將代理WCF服務添加到新的前端UI服務中。 –

+0

你的UI期望從WCF服務中得到什麼? HTML或其他格式的迴應? –

+0

UI需要JSON格式的WCF服務的數據(不是html)。示例:分配給當前登錄用戶的服務器數量以及用法等等... UI是單個html文件,動態添加/刪除表單並顯示WCF服務中的數據。 –