WCF服务充当外部Web服务的代理

时间:2014-01-29 18:40:01

标签: asp.net json wcf web-services

我正在开发代理WCF服务。因此,作为此任务的一部分,我必须完成的任务是:

  1. 我必须从传入的请求中捕获标题和内容(来自 网络浏览器)。
  2. 使用标题和构造外部Web服务的Web请求 来自传入请求的内容。
  3. 执行网络请求。
  4. 从外部网络的响应中捕获标题/ Cookie /内容 服务。
  5. 构建响应,添加标头/ cookie并将响应发送回 浏览器。
  6. 我可以借助web和stackoverflow管理1,2,3和4。但没有为任务5找到任何解决方案。

    问题:

    1. 来自外部Web服务的响应消息是json。如何以json格式将相同的消息发送到Web浏览器?
    2. 外部网络服务的响应有'set-cookie'标头。如何将其添加到Web浏览器响应?
    3. 我是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;
          }
      

1 个答案:

答案 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并相应地显示数据。

希望我帮忙!