2016-06-09 59 views
0

我試圖儘可能簡單地使用C#實用程序來使用RESTful服務。響應以XML形式給出,我只想將它放入字符串中,稍後「漂亮地打印它」並將其保存在磁盤上。現在我正在努力獲得適當的迴應。服務是第三方,它運行良好,在瀏覽器和Java客戶端多次測試。在C#程序的授權去確定,據我可以告訴我在調試器中看到響應對象簡單的C#RESTful客戶端

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

爲什麼你使用'WebRequest'而不是'HttpClient'? – Luiso

+0

@Amit我不知道你的意思,但如果你問我應該怎麼回答,那麼它只是簡單的XML而沒有幾個元素。這是一些書籍,論文等目錄的服務,所以標題,作者,發佈日期,沒有什麼特別的 –

回答

1

我已經看到了使用授權頭手動一些怪異的行爲;試試這個:

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'沒有任何影響。我認爲它需要對'request.Headers'做一些工作。 –

+1

@AlastairBrown當前版本不更新request.Headers :) –

+0

其實它變得更糟了: 未處理的異常:System.Net.WebException:遠程服務器返回錯誤:(401)未經授權。 at System.Net.HttpWebRequest.GetResponse() at ConsoleApplication3.Program.Main(String [] args)in Visual Studio 2013 \ Projects lication3 \ Program.cs:line 47 –

1

我會建議使用HttpClient你正在嘗試做的,你的代碼應該是這樣的:

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

你也可以有也得到一個stringStream代替調用:response.Content.ReadAsStreamAsync().GetAwaiter().GetResult();並從那裏使用它,如果你想閱讀塊或緩衝優化。

希望這會有所幫助。也可以看看this,它可能很有用,因爲它包含幾個擴展,用於在REST中使用的流行格式之間進行轉換,儘管我不確定它是否可以幫助您在此處以及xml