2014-02-05 2 views
0

소프트웨어의 베타 출시 이후 우리가 직면 한 문제는 모든 사용자가 인증 될 수 없다는 것입니다 (우리는 웹 요청을 사용하여 인증합니다.) 무언가가 일이 발생했습니다. 정확한 원인을 정확히 알 수는 없지만 POST 요청으로 인한 것으로 확신합니다. 아래는 요청을하기 위해 사용하는 C# 메소드입니다.방화벽으로 차단되지 않도록 HTTP Post 메소드를 구성하는 방법

public static string getResponse(string url, string postdata) 
{ 
    try 
    { 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] byte1 = encoding.GetBytes(postdata); 
     HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     myHttpWebRequest.Method = "POST"; 
     myHttpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     myHttpWebRequest.ContentLength = byte1.Length; 
     Stream newstream = myHttpWebRequest.GetRequestStream(); 
     newstream.Write(byte1, 0, byte1.Length); 
     WebResponse response = myHttpWebRequest.GetResponse(); 
     Stream stream = response.GetResponseStream(); 
     StreamReader reader = new StreamReader(stream); 
     return reader.ReadToEnd(); 
    } 
    catch 
    { 
     return ""; 
    } 
} 

아마도 모든 방화벽에서 허용하는 방식으로 구성하지 않았을 수 있습니다.

그렇다면 포트 문제, 요청 자체 또는 사용자 문제인지는 알 수 없습니다. 이전에이 문제에 직면 한 사람이 있습니까? 그것을 고치기 위해 당신은 무엇을 했습니까?

POST을 구성하는 방법에 대한 "표준"이 있습니까? 대부분의 장치/방화벽에서 수용 할 수 있습니까? 우리가 올바른 항구를 사용하고 있습니까?

+0

포트가'url' 문자열에 따라 포트 80 또는 443에 기본합니다 :

는 여기에 내가 HTTP 응답 헤더를 확인하도록 채찍질 Node.js를 스크립트입니다. 'url'이 비표준 포트를 사용한다면 방화벽 문제가있을 수 있습니다. – Romoku

+0

예를 들어 피들러 (Fiddler)에서이 요청을 보내면 어떤 일이 일어나는지 보셨습니까? 어떤 반응을 보이고 있습니까? –

+0

안녕하세요 @Romoku, 당신의 포트를 지정하는 곳은'url'입니까? 포트 80 또는 443이 기본 포트이기 때문에 포트를 하드 코드하여 매번 성공할 수 있습니까? @StephenByrne 응답 헤더를 볼 때주의해야 할 사항은 무엇입니까? – theGreenCabbage

답변

0
나는 웹 예외 잡으려고 내 catch 문을 업데이트 한

: 순간에 우리가 문제를 일으키는 것에 대해 완전히 확실하지 않은 이후로 사용자의 경우

catch (WebException ex) 
{ 
    ex.writeToDebuggerOrTxtFile; 
} 

, 즉, 우리가 모르는를 , 방화벽 또는 포트를 통해 사용자를 인증 할 수 없게되면 먼저 문제를 격리해야합니다. 상태 코드가 HTTP 500, 401, 403 등과 같은 값을 반환하면 요청이 서버에서 실패하고 있음을 나타냅니다.

편집 :이 잠을 자고이 문제에 약간의 문제가 있음을 알았습니다.

설명해 드리겠습니다.

일반적으로 상태 코드가 오류를 나타내는 코드를 반환 할 수있는 경우에도 모든 HTTP 응답이 성공해야합니다. 이 방법에 접근하는 올바른 방법은 단지 WebException을 던지기 만하면되는 것이 아니라 (대부분의 "실패한"응답은 성공을 돌려 주어야하기 때문입니다), 순전히 status code을 살펴보아야합니다.

실패한 응답은 응답 헤더를 가져 오는 데는 성공하지만 올바른 방법은 상태 코드 자체를 살펴 보는 것입니다.

var http = require("http"); 

var fs = require("fs"); 
var i = 0; 

var hostNames = ['www.google.com']; 

for (i; i < hostNames.length; i++){ 

    var options = { 
      host: hostNames[i], 
      path: '/' 
    }; 

    (function (i){ 
    http.get(options, function(res) { 

     var obj = {}; 
     obj.url = hostNames[i]; 
     obj.statusCode = res.statusCode; 
     obj.headers = res.headers; 

     for(var item in res.headers){ 
     obj.headers[item.replace(/\./,'\\')] = res.headers[item]; 
     } 

     console.log(JSON.stringify(obj, null, 4)); 

    }).on('error',function(e){ 
     console.log("Error: " + hostNames[i] + "\n" + e.stack + "\n"); 
    }); 
    })(i); 
}; 
+1

그건 좋은 출발입니다. 정확히 무엇이 잘못 될지 알려줄 것입니다. –

관련 문제