2013-03-05 4 views
1

CORS 문제가 발생했습니다. 서버 프록시를 사용하여 처리하려고합니다. 가장 신뢰할 수있는 처리 방법 인 것처럼 보입니다. 하지만 POST 요청으로 주요 문제가 발생합니다.JSON 내용으로 HTTP POST를 프록시 처리합니다.

프록시의 일반적인 구조는 다음과 같습니다 JQuery-based client -> WebServer HttpHandler Proxy -> WebAPI Service

클라이언트는 JSON 페이로드를 사용하고 대가를 기대하고있다.

예 클라이언트 : 우리는뿐만 아니라 amplify.js를 사용

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!'); } 
} 

, 단지 객체의 기초가되는 JQuery와 주위에 약간의 래퍼를 추가합니다.

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; 
} 

이 모든 비 - 프록시 상황에서 잘 작동 완성도를 들어, 다음은 jquery.ajax 매개 변수의 나머지에있는 요청의 정의입니다. 보시다시피 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 메서드는 요청 개체에 대해 null 값을 사용하여 호출됩니다. 나는이 시점에서 어디로 가야할지 모른다.

답변

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); 
    } 
} 
+0

와우, 예, ContentType 일뿐입니다. 또한 전체 프로세스를 처리하는 데 훨씬 깨끗한 방법이며, 매우 잘 수행됩니다. 나는 당신에게 2 + 1을 줄 수 있었으면 좋겠지 만, 다른 사람들이 그것을 제공하기를 희망한다. – CodexArcanum

관련 문제