【问题标题】:C# HttpWebRequest returns blankC# HttpWebRequest 返回空白
【发布时间】:2017-06-20 12:51:40
【问题描述】:

我一直在阅读无数与我的问题相关的问题,但没有一个能解决我的问题。我在 c# 中创建一个 HttpWebRequest,在其中发布数据然后读取响应,但响应始终返回为空白。我尝试更改request.contentType,以未编码、ASCII 和 UTF8 的各种格式对数据进行编码。不管我做什么,我的回答都是空白的。另外作为旁注,我的请求正在通过第 7 层。

var request = (HttpWebRequest)WebRequest.Create(serviceURL);
var postData = "\"device\"=\"9856\"";
var data = Encoding.ASCII.GetBytes(postData);
//request.ContentType = "application/x-www-form-urlencoded";
request.ContentType = "application/json; charset=utf-8";
request.Timeout = 5000;
request.Headers.Add("Authorization", b64);
request.Headers.Add("reqtime", hmacTS);
request.Headers.Add("appkey", APP_KEY1);
request.Method = "POST";
request.ContentLength = data.Length;

try
{
    using (var stream = request.GetRequestStream())
    {
        stream.Write(data, 0, data.Length);
    }
    var response = (HttpWebResponse)request.GetResponse();
    using (var streamReader = new StreamReader(response.GetResponseStream()))
    {
        var result = streamReader.ReadToEnd();
        updateWindow(this, "Results: " + result);
        updateWindow(this, "Type: " + response.ContentType);
        updateWindow(this, "Content Length: " + response.ContentLength);
    }
}
catch (WebException a)
{
    updateWindow(this, "ERROR: " + a);
}

我的回复显示为:

Results:  
Type: application/octet-stream
Content Length: 0

只是为了更新大家,我终于找到了问题的根源。由于数据库连接中断,服务提供商不得不重新启动他们的服务器。经过大约一周的与此代码的斗争,我猜他们最终决定为我检查.....感谢所有试图提供帮助的人!

【问题讨论】:

  • 您是否尝试过使用 Fiddler 之类的工具来实际查看您通过网络发送和接收的内容?
  • 是的,我一直在使用提琴手,而且身体似乎是正确的。提琴手也没有显示任何交易异常。
  • 我在提琴手中看不到响应体。显然我没有得到任何回报.. Content-Length: 0, Content-Type: application/octet-stream
  • 威尔斯先生有什么有用的建议吗?
  • 当您尝试来自 Postman 的相同 POST 时,您是否得到空响应? chrome.google.com/webstore/detail/postman/…

标签: c# asp.net web-services httpwebrequest


【解决方案1】:
public static bool GetResponseForJson( string url, out object jsonObject )
{
  bool result;

  try {

    HttpWebRequest webRequest = ( HttpWebRequest )WebRequest.Create( url );
    webRequest.Method = "POST";
    HttpWebResponse httpWebResponse = ( HttpWebResponse )webRequest.GetResponse();
    StreamReader sr = new StreamReader( httpWebResponse.GetResponseStream() );
    jsonObject = new JavaScriptSerializer().DeserializeObject( sr.ReadToEnd() );
    result = true;
  }
  catch {

    jsonObject = null;
    result = false;
  }
  return result;
}

这是我用于从 url 获取响应对象的方法,您可以将 webRequest.Method 更改为 GET 等。

【讨论】:

  • 感谢您的建议。除了 Json 反序列化之外,您的代码与我的代码几乎相同。我尝试了这个建议,但我的回复仍然是空白。
  • @Konan 所以在你的情况下, sr.ReadToEnd() 返回一个空字符串?
  • @Konan 我不相信这实际上会成为你的问题
【解决方案2】:

首先检查响应 HTTP 代码。您也正在使用授权。检查授权标头值是否正确。如果您使用不记名令牌授权,则需要将“不记名”放在标头中的实际令牌之前。

【讨论】:

  • 我正在使用授权并且我的授权标头值是正确的。如果我通过第 7 层得到异常,它不会显示某种形式的错误吗?
  • 这取决于后端的实现。正确的方法是通过 HTTP 代码返回状态。
【解决方案3】:

在请求中添加 Accept 标头:

request.Headers.Add("Accept", "application/json");

这对我有用。

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2022-01-04
    • 2018-12-23
    • 2017-11-20
    • 1970-01-01
    • 2011-05-27
    • 2012-09-06
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多