【问题标题】:Proxying HTTP POST with JSON contents使用 JSON 内容代理 HTTP POST
【发布时间】:2013-02-20 13:00:54
【问题描述】:

我们遇到了一些 CORS 问题,我正在尝试使用服务器代理来解决它,因为这似乎是处理它的最可靠方法。但是我遇到了 POST 请求的主要问题。

代理的一般结构是: JQuery-based client -> WebServer HttpHandler Proxy -> WebAPI Service

客户端使用 JSON 负载并期望它们作为回报。

示例客户端:

ourcompany.datasource.postData({
    data: ko.toJSON(requestObject),
    success: function (response, status) { ourcompany.messenger.success('Thanks for the data!');},
    error: function () { ourcompany.messenger.fail('Oh no!'); }
}

我们也使用 amplify.js,它只是在 jquery 底层对象周围添加了一些包装器。为了完整起见,这里是请求的定义,其余的 jquery.ajax 参数位于:

amplify.request.define('postData', 'ajax', {
    url: buildProxyUrl(outCompany.urls.svcData),
    type: 'POST',
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    beforeSend: addCustomHeaders,
    decoder: wrapperDecoder
});

示例 webapi:

[HttpPost]
public HttpResponseMessage PostData(PostDataRequest request)
{
      HttpResponseMessage response = null;
      var response = BusinessLayer.DoSomeStuff(request);
      return response;
}

这在非代理情况下一切正常。如您所见,我们通过在 WebAPI 端反序列化一些 JSON 来创建一个复杂的 .NET 对象。

代理把这一切搞砸了。从本质上讲,我无法弄清楚如何在第二个请求中发送原始请求的 JSON 内容,而不会被传输弄乱。当前代码如下所示:

private void MakeHttpPostRequest(HttpContext context)
{
    var url = context.Request["url"];
    var req = WebRequest.Create(url);
    req.Method = "POST";
    req.Headers["x-customheader"] = context.Request.Headers["x-customheader"];

    var reqStream = req.GetRequestStream();
    context.Request.InputStream.Position = 0;
    context.Request.InputStream.CopyTo(reqStream);
    reqStream.Close();
    context.Request.InputStream.Close();


    using (var stream = req.GetResponse().GetResponseStream())
    {
        using (var reader = new StreamReader(stream))
        {
            var content = reader.ReadToEnd();
            context.Response.ContentType = "application/json";
            context.Response.Write(content);
        }
    }
}

我尝试了其他几种提取内容并推送到传出请求的方法,但似乎没有任何效果。在最好的情况下,WebAPI 方法被调用,请求对象的值为空。我现在不知道该去哪里。

【问题讨论】:

    标签: jquery asp.net-mvc json proxy cors


    【解决方案1】:

    您忘记在代理中设置请求 Content-Type 标头。您还忘记正确处置所有 IDisposable 资源:

    private void MakeHttpPostRequest(HttpContext context)
    {
        var url = context.Request["url"];
        var req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = context.Request.HttpMethod;
        req.ContentType = context.Request.ContentType;
        req.Headers["x-customheader"] = context.Request.Headers["x-customheader"];
    
        using (var reqStream = req.GetRequestStream())
        {
            context.Request.InputStream.Position = 0;
            context.Request.InputStream.CopyTo(reqStream);
        }
    
        using (var response = (HttpWebResponse)req.GetResponse())
        using (var stream = response.GetResponseStream())
        {
            context.Response.ContentType = response.ContentType;
            stream.CopyTo(context.Response.OutputStream);
        }
    }
    

    【讨论】:

    • 哇,是的,它只是 ContentType。此外,这是处理整个过程的一种更清洁的方式,做得非常好。我希望我能给你两个 +1,但希望其他人会提供这个!
    猜你喜欢
    • 2021-11-15
    • 2015-03-18
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    相关资源
    最近更新 更多