asp.net WebRequest流抛出'此流不支持搜索操作'调试器中的错误

时间:2015-04-22 21:45:40

标签: c# asp.net json web-services webrequest

我是asp.net中WebRequest调用的新手。我尝试将WebRequest与Expedia(EAN)API(https://developer.ean.com/code-library/)一起使用。他们有一个不起作用的例子(据我所知)并且即使使用他们自己的API也不帮助编码员。

以下是我的问题:

当我在调试器中调用request.GetRequestStream()时,我得到了回复 " '((System.Net.ConnectStream)数据流)。长度'抛出了#System; No.SuotedException'"'值#34;此流不支持搜索操作"。

当然,GetResponse()调用会超时。

我也不清楚Web字符串的哪个部分被发送到.Create方法(下面的xmlpath)以及哪个部分被流式传输到请求(下面的postData)?

以下是代码:

string xmlpath = "http://api.ean.com/ean-services/rs/hotel/v3/avail?";
string postData = "minorRev=99&cid=55505&apiKey=cbrzfta369qwyrm9t5b8y8kf&locale=en_US&currencyCode=USD&_type=json&hotelId=125719&arrivalDate=11/11/2015&departureDate=11/13/2015&includeDetails=true&includeRoomImages=true&room1=2,5,7";

WebRequest request = WebRequest.Create(xmlpath);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);

request.Method = "POST";
request.ContentType = "application/json";
request.ContentLength = byteArray.Length;
request.Timeout = 10000;

Stream dataStream = request.GetRequestStream();

dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse myResponse = request.GetResponse();

StreamReader reader = new StreamReader(myResponse.GetResponseStream());
string responseFromServer = reader.ReadToEnd();

我知道考虑到它的第三方API可能会有很多,但有没有人看到我可能做错了什么?

谢谢, -Dave

1 个答案:

答案 0 :(得分:0)

如果您查看他们的文档,您会看到:

  

通过此标准基本URL访问EAN API中的服务   所有协议的格式

这意味着您需要执行GET请求并在网址中粘贴搜索参数。所以你的代码可能看起来像这样:

var url =
    "http://api.ean.com/ean-services/rs/hotel/v3/avail" +
    "?minorRev=99&cid=55505&apiKey=cbrzfta369qwyrm9t5b8y8kf&locale=en_US" +
    "&currencyCode=USD&_type=json&hotelId=125719&arrivalDate=11/11/2015" +
    "&departureDate=11/13/2015&includeDetails=true" +
    "&includeRoomImages=true&room1=2,5,7";
var req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";

using (var res = req.GetResponse())
{
    using (var resStream = res.GetResponseStream())
    {
        using (var reader = new StreamReader(resStream))
        {
            var json = reader.ReadToEnd();
        }
    }
}

而且你真的不需要处理所有这些请求,响应和流。如果您使用的是.Net 4.5,请查看HttClient。这个类代码将非常短:

using (var httpClient = new HttpClient())
{
    var json = httpClient.GetStringAsync(url).Result;
}