我正在开发代理WCF服务。因此,作为此任务的一部分,我必须完成的任务是:
我可以借助web和stackoverflow管理1,2,3和4。但没有为任务5找到任何解决方案。
问题:
我是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 :(得分:0)
如果我做对了,您的WCF服务的客户端应用程序是一个Web浏览器。这意味着它需要 HTML文档作为回复吗?在这种情况下,我建议避免使用WCF服务。
为什么不使用构成HTML的 ASP.NET页面来返回?在您的ASP.NET代码中,您可以执行您描述的4个四个步骤。在第5步中,您将调整HTML以包含从外部Web服务中获得的数据。
您总是可以使用WCF服务构建HTML响应,但我看不出原因。您可以使用HTML DOM解析器(如this)以编程方式构建HTML响应,但这不是我的第一种方法。
如果您的网页需要纯数据而非HTML,则您的WCF服务可能会以JSON格式返回数据。如您所见,JSON是一个简单的字符串,可以很容易构造。这取决于您想要返回的数据,但它可以非常容易地手动实现,或使用某些特定的库(如Json.NET)。然后,您的UI应用程序将解析JSON并相应地显示数据。
希望我帮忙!