我正在開發代理WCF服務。所以,我要實現此分配的部分任務是:WCF服務充當外部Web服務的代理
- 我要捕捉標題和內容從傳入的請求(從 Web瀏覽器)。
- 構建一個具有標題的外部Web服務的Web請求,以及來自請求的內容 。
- 執行網絡請求。
- 捕獲標頭/ Cookie /內容形成外部網絡 服務的響應。
- 構建響應,添加標頭/ cookies並將響應發送回 瀏覽器。
我可以在web和stackoverflow的幫助下管理1,2,3和4。但沒有找到任何解決方案的任務5.
問題:從外部Web服務
- 響應消息是JSON。如何將json格式的相同消息發送到Web瀏覽器?
- 外部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;
}
是的,客戶端是一個網頁瀏覽器。這背後的實際情況是,我們有一個既有前端用戶界面又有api服務的現有服務。現在我們正在將前端用戶界面用於新服務,並保持api服務不變。所以新的前端服務需要與api服務交談以獲取數據以顯示給用戶。我們必須在不對前端UI代碼庫和API服務進行更改的情況下實現此目的。所以爲了實現這一點,我將代理WCF服務添加到新的前端UI服務中。 –
你的UI期望從WCF服務中得到什麼? HTML或其他格式的迴應? –
UI需要JSON格式的WCF服務的數據(不是html)。示例:分配給當前登錄用戶的服務器數量以及用法等等... UI是單個html文件,動態添加/刪除表單並顯示WCF服務中的數據。 –