【问题标题】:WCF service act as proxy for external web serviceWCF 服务充当外部 Web 服务的代理
【发布时间】:2014-01-29 18:40:00
【问题描述】:

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

  1. 我必须从传入的请求(从 网络浏览器)。
  2. 为外部 Web 服务构造一个 Web 请求,其中包含标头和 来自传入请求的内容。
  3. 执行网络请求。
  4. 从外部 Web 的响应中捕获标头/cookies/内容 服务。
  5. 构造响应,添加标头/cookie 并将响应发送回 浏览器。

我可以在 web 和 stackoverflow 的帮助下管理 1、2、3 和 4。但找不到任务 5 的任何解决方案。

问题:

  1. 来自外部 Web 服务的响应消息是 json。如何将 json 格式的相同消息发送到网络浏览器?
  2. 来自外部 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


    【解决方案1】:

    如果我没看错的话,你的 WCF 服务的客户端应用程序是一个网络浏览器。这意味着它需要一个 HTML 文档 作为响应,对吧?在这种情况下,我建议避免使用 WCF 服务。

    为什么不使用一个 ASP.NET 页面 来形成要返回的 HTML?在您背后的 ASP.NET 代码中,您可以执行您描述的 4 个四个步骤。在您的第 5 步中,您将调整 HTML 以包含您在前面的步骤中从外部 Web 服务获得的数据。

    您总是可以使用 WCF 服务构造 HTML 响应,但我不明白为什么。您可以使用 HTML DOM 解析器(如 this 以编程方式构造 HTML 响应,但这不是我的第一种方法。

    如果您的页面需要纯数据而不是 HTML,您的 WCF 服务可以返回 JSON 格式的数据。如您所见,JSON 是一个非常容易构造的简单字符串。这取决于您要返回的数据,但它可以很容易地手动实现,或者使用一些特定的库,如Json.NET。然后您的 UI 应用程序将解析 JSON 并相应地显示数据。

    希望我能帮上忙!

    【讨论】:

    • 是的,客户端是一个网络浏览器。这背后的实际故事是,我们有一个既有前端 UI 又有 api 服务的现有服务。现在我们将前端 UI 引入新服务并保持 api 服务不变。因此,新的前端服务需要与 api 服务对话以获取数据以显示给用户。我们必须在不更改前端 UI 代码库和 api 服务的情况下实现这一点。因此,为了实现这一点,我将代理 WCF 服务添加到新的前端 UI 服务中。
    • 您的 UI 对 WCF 服务的期望是什么? HTML 或其他格式的响应?
    • UI 需要来自 WCF 服务的 JSON 格式的数据(不是 html)。示例:分配给当前登录用户的服务器数量以及使用情况等... UI 是单个 html 文件,动态添加/删除表单并显示来自 WCF 服务的数据。
    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-26
    相关资源
    最近更新 更多