首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MVC6中将HTTP响应传递给客户端

在MVC6中将HTTP响应传递给客户端
EN

Stack Overflow用户
提问于 2015-08-11 01:25:47
回答 1查看 2.5K关注 0票数 2

我是Web API和HTTP的新手。

我使用的是MVC6(测试版)。我有一个代理服务(Web ),它有一个POST方法,用于从返回XML内容的另一个服务获取响应。我需要将响应内容返回给客户端,因为客户端不能直接调用服务。

代码语言:javascript
运行
复制
// In my proxy service
public HttpResponseMessage Post(String content) 
{
    using ( HttpClient client = new HttpClient() ) {

        .......

        HttpResponseMessage response = client.PostAsync(uri, content).Result;

        // I get everything I need in the "response".

        // How to return the response or it body to the client.
        // return response;
    }
}

我需要将“响应”返回给客户端,而不做任何更改或只做最少的更改。我尝试了“返回响应”,或者创建一个新的HttpResponseMessage,但是我只得到了类似这样的东西

代码语言:javascript
运行
复制
{"Headers":[{"Key":"Content-Type","Value":["text/xml"]}]} 

在身体里。

那么有没有一种简单的方法可以把响应传递回客户端呢?谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-08-11 07:23:44

ASP.NET团队目前正在开发一种“代理中间件”,它可以实现您想要的功能:https://github.com/aspnet/Proxy

下面是它的内部工作原理:

代码语言:javascript
运行
复制
public async Task Invoke(HttpContext context)
{
    var requestMessage = new HttpRequestMessage();
    if (string.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase))
    {
        var streamContent = new StreamContent(context.Request.Body);
        requestMessage.Content = streamContent;
    }

    // Copy the request headers
    foreach (var header in context.Request.Headers)
    {
        if (!requestMessage.Headers.TryAddWithoutValidation(header.Key, header.Value) && requestMessage.Content != null)
        {
            requestMessage.Content?.Headers.TryAddWithoutValidation(header.Key, header.Value);
        }
    }

    requestMessage.Headers.Host = _options.Host + ":" + _options.Port;
    var uriString = $"{_options.Scheme}://{_options.Host}:{_options.Port}{context.Request.PathBase}{context.Request.Path}{context.Request.QueryString}";
    requestMessage.RequestUri = new Uri(uriString);
    requestMessage.Method = new HttpMethod(context.Request.Method);
    using (var responseMessage = await _httpClient.SendAsync(requestMessage, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted))
    {
        context.Response.StatusCode = (int)responseMessage.StatusCode;
        foreach (var header in responseMessage.Headers)
        {
            context.Response.Headers.SetValues(header.Key, header.Value.ToArray());
        }

        foreach (var header in responseMessage.Content.Headers)
        {
            context.Response.Headers.SetValues(header.Key, header.Value.ToArray());
        }

        // SendAsync removes chunking from the response. This removes the header so it doesn't expect a chunked response.
        context.Response.Headers.Remove("transfer-encoding");
        await responseMessage.Content.CopyToAsync(context.Response.Body);
    }
}

https://github.com/aspnet/Proxy/blob/dev/src/Microsoft.AspNet.Proxy/ProxyMiddleware.cs

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31925621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档