【问题标题】:Method seems unavailable for 403 response body in C#方法似乎不适用于 C# 中的 403 响应主体
【发布时间】:2018-04-14 03:32:12
【问题描述】:

这是我的网络请求代码块,
向下滚动到它的底部以捕获异常

try 
{
     var webRequest = System.Net.WebRequest.Create (WEBSERVICE_URL);
     if (webRequest != null) {
     webRequest.Method = "POST";
     //webRequest.Timeout = 12000;
     webRequest.ContentType = "application/x-www-form-urlencoded";
     webRequest.Headers.Add ("Key", _apiKey);
     webRequest.Headers.Add ("Sign", genHMAC ());
     byte[] dataStream = Encoding.UTF8.GetBytes("command=returnBalances&nonce=" + nonce);
     webRequest.ContentLength = dataStream.Length;
     Stream newStream = webRequest.GetRequestStream();
     newStream.Write(dataStream, 0, dataStream.Length);
     newStream.Close();

     using (System.IO.Stream s = webRequest.GetResponse ().GetResponseStream ()) {
            using (System.IO.StreamReader sr = new System.IO.StreamReader (s)) {
                    var jsonResponse = sr.ReadToEnd ();
                    OutputText.text = jsonResponse.ToString ();
            }
         }
     }
} 
catch (Exception ex) 
{
     OutputText.text = ex.ToString ();
}

这给了我一个“错误(403)禁止”和异常堆栈跟踪,但我正在尝试获取 403 响应正文:

我无法让 Unity C# 接受以下代码:提到 here

catch(WebException ex)
{
     var response = (HttpWebResponse)ex.Response;
}

我需要什么才能使这个方法起作用?我需要响应正文

【问题讨论】:

  • 这意味着您无权访问该资源。您必须测试您的凭据,通过使用邮递员来验证和缩小真正的问题。
  • “无法让 Unity C# 接受”你的意思是你得到一个编译错误?具体是什么?
  • WebException 显示为红色,并且我当前的异常(ex)没有为类型 Exception 提供 ex.Response,我想我错过了一个库,可能在你输入“使用等”的地方。 .." 在所有脚本的顶部
  • 您生成 Sign 的方式似乎是错误的。要为 Poloniex 生成有效符号,所有 POST 数据(您的 dataStream 变量)必须用作 HMAC 的输入。在您有要签名的数据之前,您无法生成签名。
  • 这里是在我的 genHMAC() 函数中签名的: private string genHMAC() { byte [] APISecret_Bytes = System.Text.Encoding.UTF8.GetBytes(_apiSecret); var hmac = new HMACSHA512(APISecret_Bytes);返回 hmac.ToString(); }

标签: c# response system.net.webexception poloniex webexception


【解决方案1】:

hmac.ToString() 不会生成有效符号。要为 Poloniex 生成有效符号,您必须使用 HMACSHA512.ComputeHash 方法并将其传递给 dataStream 作为参数。从此方法返回的字节必须转换为十六进制字符串。

这应该会生成有效的符号:

var hmac = new HMACSHA512(APISecret_Bytes);
var signBytes = hmac.ComputeHash(dataStream);
var sign = String.Join("", signBytes.Select(b => b.ToString("X2")));

关于WebException,它是在System.Net命名空间中声明的,所以确保你有using System.Net;。根据目标框架,WebException 应该位于System.Net.Requests.dllSystem.dllnetstandard.dll。不幸的是,我对 Unity 没有任何经验,但如果我猜测它以普通 .NET Framework 为目标是正确的,那么在 System.dll 中声明了 WebException 并且您的项目应该已经引用它并且不需要额外的程序集引用.

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-04
    • 1970-01-01
    相关资源
    最近更新 更多