2016-06-09 62 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