2012-04-26 4 views
1

Bonitasoft의 워크 플로 엔진 인 타사 오픈 소스 서버 소프트웨어에서 REST 웹 서비스를 사용하고 있습니다. 이것은 Apache에서 실행 중입니다. 이 소프트웨어는 불행히도 웹 서비스 호출에 대해서만 POST 메서드를 허용합니다.REST HttpWebRequest GetResponseStream() 오류 500

전화의 기본 사항을 테스트하기 위해 문제없이 Firefox 용 포스터 추가 기능을 사용할 수있었습니다.

:
  • 몸을 -urlencoded

    이 정보로 추가 기능을 실행 한 후 찾고있는 정보가있는 응답을 받았습니다. 클라이언트 나 서버에서 호출과 관련된 오류는 없습니다. 이 메시지는 포스터를 통해 전화를 걸 때 서버 로그에 기록됩니다.

    10.0.5.1 - username [26/Apr/2012:16:06:24 -0600] "POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 200 981091 
    

    모든 시스템이 작동합니다.

    이제이 포스터 유틸리티와 동일한 기능을 수행하는 C# 콘솔 앱을 만들려고합니다. 나는 그것이 문제없이하지만이 방법은 내가 다음과 같은 오류가 호출되면하는 GetResponse() 메소드에 도달 응용 프로그램을 실행할 때

    // Create the URI Address 
    var address = new Uri(url); 
    
    // Create the web request 
    var request = WebRequest.Create(address) as HttpWebRequest; 
    
    // Set type to POST 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Credentials = new NetworkCredential("username", "password"); 
    
    // Create the data we want to send 
    var data = HttpUtility.UrlEncode("options=user:100,password:100"); 
    
    // Set the content length in the request headers 
    request.ContentLength = data; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        using (StreamWriter writeStream = new StreamWriter(postStream)) 
        { 
         writeStream.Write(data); 
        } 
    } 
    
    // Get response 
    using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
    { 
        // Get the response stream 
        StreamReader reader = new StreamReader(response.GetResponseStream()); 
    
        // Console application output 
        Console.WriteLine(reader.ReadToEnd()); 
    } 
    

    가 (스택 트레이스를 절단 : 다음은 내가 함께 일하고 현재 테스트 코드) : 물론

    10.0.5.1 - - [26/Apr/2012:16:21:08 -0600] "POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 401 1331172 
    10.0.5.1 - username [26/Apr/2012:16:21:08 -0600] "options%3duser%3a100%2cpassword%3a100POST /bonita-server-rest/API/queryDefinitionAPI/getLightProcesses HTTP/1.1" 500 1150384 
    

    이 첫번째 생각은 서비스가 F 아닌 것을 :

    System.Net.WebException: The remote server returned an error: (500) Internal Server Error. 
    

    은 다음 아파치에 의해 기록 된 로그 정보입니다 제대로 작동하지만 독립 실행 형 클라이언트가 오류없이 서비스를 호출 할 수 있기 때문에 그렇지 않은 것으로 판명되었습니다. 기사 및 질문이 많지만이 문제를 해결할 수 없습니다. 응답을받는 것과 관련하여 내가 잘못하고있는 것이 있습니까? 다른 아이디어?

    참고로이 서비스 콜을 Grails (한숨)와 똑같이 수행 했으므로 오류가 발생하지 않았습니다.

    는 ** 업데이트 1 ** 나는를 추가하여 (401)을 제거하기 위해 시도 :

    request.PreAuthenticate = true; 
    

    그러나 이것은 내 문제가 해결되지 않았다.

    ** 업데이트 2 ** 내가 수동으로 다음 코드를 사용하여 헤더를 설정하여 (401)을 제거 할 수 있었다 :

    byte[] authBytes = Encoding.UTF8.GetBytes("username:password".ToCharArray()); 
    request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(authBytes); 
    

    것은 내가 수동으로 포스터 요청 및 I에 헤더를 추가해야하기를 500 오류는 아니지만 예상 한 데이터를 수신합니다. 그러나 .NET 구현을 통해 여전히 500 오류가 발생합니다.

  • +0

    Apache 로그의 첫 번째 행은 401 (Unauthorized) 오류를 나타냅니다. 문제가 될 수 있을까요? –

    +0

    제목 앞에 "C# -"등을 붙이지 마십시오. 그것이 바로 태그가있는 것입니다. –

    +0

    요점은 유감 스럽다. –

    답변

    2

    문제점을 해결했습니다.

    문서의 대다수에 맞춰 필자는 필자가 작성해야하는 본문 데이터의 바이트 배열로 다시 이동했습니다.

    // Create the data we want to send 
    var data = HttpUtility.UrlEncode("options=user:100,password:100"); 
    
    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    
    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        postStream.Write(data); 
    } 
    

    이것은 내 문제를 해결하지 못했지만 공통점을 가지고 있습니다. 그런 다음 브라우저 추가 기능을 통해 전송 된 헤더 및 본문을보고 UTF8 인코딩 전에 URL 인코딩 된 내용이 아닌 것을 확인하기 위해 UTF8 인코딩을 취소했습니다. 나는 다음 URL 인코딩을 수행하지 내 코드를 변경하고 그것을 문제없이 일 :

    // Create the data we want to send 
    var data = "options=user:100,password:100"; 
    
    // Create a byte array of the data we want to send 
    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data); 
    
    // Set the content length in the request headers 
    request.ContentLength = byteData.Length; 
    
    // Write data 
    using (Stream postStream = request.GetRequestStream()) 
    { 
        postStream.Write(data); 
    } 
    

    그것은 내가 그것을 놓친 방법을 잘 모르겠습니다 너무 간단한 것 같다. 이것에 대한 당신의 도움에 감사드립니다. 바라기를 이것은 일부 사람들을 도와 줄 것입니다.

    0

    요청이 웹 브라우저에서 제대로 작동한다고 가정하면 문제는 인증 정보가 서버로 전달되는 순서 일 수 있습니다.

    request.PreAuthenticate을 true로 설정하십시오. 문제를 해결해야합니다.

    +0

    내가 추가했습니다 : request.PreAuthenticate = true; 나는 여전히 같은 결과를 얻고 있습니다. –