2016-06-09 3 views
0

가능한 간단한 C# 유틸리티로 RESTful 서비스를 사용하려고합니다. 응답은 XML로 주어지며 문자열로 넣고 나중에 "예쁘게 인쇄"하여 디스크에 저장하려고합니다. 현재로서는 적절한 응답을 얻으려고 노력하고 있습니다. 서비스는 제 3 자이며 브라우저와 자바 클라이언트에서 여러 번 테스트되었습니다. C#을 유틸리티 인증 확인을 가서 지금까지 내가 말할 수있는 나는간단한 C# RESTfull 클라이언트

StatusCode OK System.Net.HttpStatusCode

StatusDescription "OK" string

하지만, 응답 자체가 비어 같다고 응답 객체에 디버거에서 볼? String String (비어 있지 않지만 비어 있음)으로 응답을 보유해야하는 Xml입니다. 내가 뭘 잘못 했니? 여기

는 전체 코드입니다 : 내가 수동으로 인증 헤더를 사용하여 몇 가지 이상한 행동을 본 적이

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Web; 
using System.IO; 
using System.Net; 
using System.Xml; 

namespace ConsoleApplication3 
{ 
    class Program 
    { 

     public static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
     { 
      string authInfo = userName + ":" + userPassword; 
      authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); 
      request.Headers["Authorization"] = "Basic " + authInfo; 
     } 

     static void Main(string[] args) 
     { 
      HttpWebRequest request = null; 
      HttpWebResponse response = null; 
      String Xml; 

      // Create the web request 
      request = WebRequest.Create("https://some.web.services.com?id='1234'&param1='1'&param2='2'") as HttpWebRequest; 
      SetBasicAuthHeader(request, "userName", "userPassword"); 

      // Get response 
      response = request.GetResponse() as HttpWebResponse; 

      // Get the response stream 
      StreamReader reader = new StreamReader(response.GetResponseStream()); 

      Xml = reader.ReadToEnd(); 

      // Console xml output 
      Console.WriteLine(Xml); //see if we get the xml response 
     } 
    } 
} 
+0

"유선"은 무엇입니까? – Amit

+0

왜'HttpClient' 대신'WebRequest'를 사용하고 있습니까? – Luiso

+0

@ 당신이 무슨 뜻인지 모르겠다.하지만 내가 무엇을 응답해야하는지 묻는다면 몇 가지 요소가있는 단순한 XML이다. 책, 논문 등의 카탈로그를위한 일부 서비스입니다. 제목, 저자, 게시 날짜, 특별한 것은 없습니다. –

답변

1

; 이 시도 : 당신은 또한 또한하여 stringStream 대신 입수했습니다 수

static void Main(...) 
{ 
    var token = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{pwd}")); 
    using(var client = new HttpClient()) 
    { 
     client.DefaultHeaders.Authorization = new AuthenticationHeaderValue("Basic", token); 

     // here you could also use await right after GetAsync but since a Console application I use this instead 
     var response = client.GetAsync(url).GetAwaiter().GetResult(); 

     // again the await could help here 
     var xml = response.Content.ReadAsStringAsync().GetAwaiter().GetResult(); 

     Console.WriteLine(xml); 
    } 
} 

:

using System.Net; // contains HttpRequestHeader enum 

    public static void SetBasicAuthHeader(WebRequest request, String userName, String userPassword) 
    { 
     string authInfo = userName + ":" + userPassword; 
     authInfo = Convert.ToBase64String(Encoding.ASCII.GetBytes(authInfo)); 
     string authHeader = string.Format("Basic {0}", authInfo); 
     request.Headers[HttpRequestHeader.Authorization] = authHeader; 
    } 
+0

이 코드는'request.Headers'에 영향을 미치지 않습니다. 나는 그것이 요청하기 위해 어떤 일을 할 필요가 있다고 생각한다. –

+1

@AlastairBrown 현재 버전이 요청을 업데이트합니다. 헤더 : –

+0

실제로 더 악화되었습니다. 처리되지 않은 예외 : System.Net.WebException : 원격 서버에서 오류를 반환했습니다. (401) Unauthorized. Visual Studio 2013 \ Projects의 ConsoleApplication3.Program.Main (String [] args)에있는 lication3 \ Program.cs : line 47 –

1

나는 당신의 코드는 다음과 같이해야합니다, 당신이 뭘 하려는지 HttpClient를 사용하는 것이 좋습니다 호출 : response.Content.ReadAsStreamAsync().GetAwaiter().GetResult(); 그리고 청크로 읽거나 최적화하기 위해 버퍼링하려는 경우 원하는대로 사용하십시오.

희망이 도움이됩니다. 또한 this을 살펴보십시오. REST에서 사용되는 널리 사용되는 형식간에 변환 할 수있는 몇 가지 확장자가 포함되어 있기 때문에 유용 할 수 있습니다. 단, xml으로도 도움이 될지 모르겠습니다.