简单的WebClient在本地工作,但在部署到Azure时无法工作

时间:2019-02-22 17:18:48

标签: c# azure webclient

我有一个非常简单的测试应用程序,它创建一个WebClient并从第三方API获取响应(已删除敏感信息):

using (WebClient client = new WebClient())
{
    var baseAddress = new Uri("https://test-url");

    client.Headers["Content-Type"] = "application/json";            

    var parms = Encoding.Default.GetBytes(
        "{ \"username\":\"<USERNAME>\"," +
           "\"password\":\<PASSWORD>\"," +
           "\"client_id\":\"<CLIENT_ID>\"," +
           "\"client_secret\":\"<CLIENT_SECRET>\"" +
        "}"
    );

    // Get access token
    var responseObject = new ResponseObject();
    var responseBytes = new byte[] { };
    string responseBody;           

    try
    {
        responseBytes = client.UploadData(baseAddress, "POST", parms);
        responseBody = Encoding.UTF8.GetString(responseBytes);
        responseObject = JsonConvert.DeserializeObject<ResponseObject>(responseBody);
    }
    catch (WebException ex)
    {
        var resp = (HttpWebResponse)ex.Response;
        Console.WriteLine(resp.StatusDescription);
    }
}

当我在本地多次运行时,此代码可以完美运行。我得到了答复,并且能够从中提取所需的信息。

但是,一旦将此代码部署到Azure,我尝试使用POSTMAN调用API,并且收到一条错误消息,告诉我“对象引用未设置为对象实例”。在try / catch中此行的错误:

var resp = (HttpWebResponse)ex.Response;

Indication of error-causing line

因此,我在API上附加了一个远程调试器,并逐步完成了这一小段代码。我感到很奇怪的是,当程序跳入代码的catch部分时我可以看到正确的内容,但是没有ex异常对象。我的意思是,我可以在调试中将鼠标悬停在ex变量上,而没有任何显示。即使将鼠标悬停在ex.Response上也不会显示任何内容。因此,由于不存在任何内容(即ex似乎不存在,甚至没有null值),因此应用程序使用零引用错误进行轰炸。

我的想法是,Azure中可能有某些内容阻止了URL,因为我可以在本地运行它而不会出现问题。我在这里问我们的网络人员,他们说不应设置任何他们知道的限制以防止呼叫中断。奇怪的是,我为此应用程序在Azure中打开了诊断日志记录,但未显示任何内容。即使我可以使用浏览器或PostMan打应用程序,日志中也没有任何显示。所以,这是另一件事。我希望能够看到某物

无论如何,我希望也许有人以前遇到过类似的情况,并且可以将我引向可能阐明这一点并让我获得可行解决方案的文章/解决方案/博客。

谢谢!

编辑:添加了错误消息的屏幕截图,该错误消息出现在浏览器中:

enter image description here

编辑:添加了应用程序在其上引发异常的行:

responseBytes = client.UploadData(baseAddress, "POST", parms);

尝试执行此行后,它立即跳转到catch,但没有出现WebException。

编辑:我找到了解决方案,并将其添加为下面的答案。

1 个答案:

答案 0 :(得分:0)

我找到了一个可行的解决方案,并且只用了一行代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

因此,基本上,我只需要设置SecurityProtocol。我不知道在没有它的情况下它是如何在本地工作的,但是显然要在Azure上运行它。