【发布时间】:2014-01-29 18:40:00
【问题描述】:
我正在开发代理 WCF 服务。因此,作为这项任务的一部分,我必须完成的任务是:
- 我必须从传入的请求(从 网络浏览器)。
- 为外部 Web 服务构造一个 Web 请求,其中包含标头和 来自传入请求的内容。
- 执行网络请求。
- 从外部 Web 的响应中捕获标头/cookies/内容 服务。
- 构造响应,添加标头/cookie 并将响应发送回 浏览器。
我可以在 web 和 stackoverflow 的帮助下管理 1、2、3 和 4。但找不到任务 5 的任何解决方案。
问题:
- 来自外部 Web 服务的响应消息是 json。如何将 json 格式的相同消息发送到网络浏览器?
- 来自外部 Web 服务的响应具有“set-cookie”标头。如何将此添加到网络浏览器响应中?
我是 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;
}
【问题讨论】:
标签: asp.net json wcf web-services