【问题标题】:Simple WebClient works locally, but not when deployed to AzureSimple WebClient 在本地工作,但在部署到 Azure 时不能
【发布时间】:2019-02-22 17:18:47
【问题描述】:

我有一个非常简单的测试应用程序,它创建一个 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;

因此,我在 API 上附加了一个远程调试器,并单步执行了这段代码。令我感到奇怪的是,当程序跳转到代码的catch 部分时,我可以正确看到,但没有ex Exception 对象。我的意思是我可以在调试中将鼠标悬停在ex 变量上,但什么也没有出现。即使悬停在ex.Response 上也没有显示任何内容。因此,由于那里什么都没有(即 ex 似乎不存在,甚至没有 null 值)应用程序会因空引用错误而爆炸。

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

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

谢谢!

编辑:添加了错误消息在浏览器中显示的屏幕截图:

编辑:添加了应用程序在下面抛出异常的行:

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

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

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

【问题讨论】:

  • 您是否有任何网络日志来确定流量是否真正流出? Azure上的服务器网络组上是否配置了任何NSG?
  • try 块中的哪一行被抛出?
  • @ColinM 我会询问我们的网络人员是否可以向我提供此信息。我在 Azure 的应用日志中看不到任何内容。
  • @mxmissile 我已经在上面编辑了我的问题以包含引发异常的行。
  • 您是否尝试过添加catch (Exception ex) 并记录ex 对象以进行跟踪?我还建议使用HttpClient 而不是WebClient,尽管在这种情况下这可能无关紧要。

标签: c# azure webclient


【解决方案1】:

我找到了一个可行的解决方案,只需要一行代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

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

【讨论】:

  • 可能 TLS1.2 尚未设置为 Azure VM 上的默认值,并且在进行 HTTPS 调用时它正在使用 TLS 1.0 或 TLS 1.1。确保您的项目面向 NET 4.6.2 或更高版本,并且如果在 web.config 中指定了 httpRuntime,还确保目标框架为 4.6.2
  • @ColinM 感谢您的建议!我现在将检查这些设置。
猜你喜欢
  • 2016-06-20
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 2013-01-05
  • 2023-01-15
  • 2020-01-09
  • 2020-11-05
  • 1970-01-01
相关资源
最近更新 更多