Simple WebClient 在本地工作,但在部署到 Azure 时不工作
Simple WebClient works locally, but not when deployed to Azure
我有一个非常简单的测试应用程序,它创建一个 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
异常对象。我的意思是,我可以在调试中将鼠标悬停在 ex
变量上,但什么也没有出现。即使将鼠标悬停在 ex.Response
上也不会显示任何内容。因此,由于那里什么都没有(即 ex
似乎不存在,甚至 null
值也不存在),应用程序会出现空引用错误。
我的想法是,也许 Azure 中的某些东西正在阻止 URL,因为我可以在本地 运行 这没有问题。我问过我们这里的网络人员,他们说不应该设置他们知道的任何类型的限制来阻止呼叫出去。奇怪的是,我在 Azure 中为此应用程序打开了诊断日志记录,但没有显示任何内容。即使我可以使用浏览器或 PostMan 访问该应用程序,日志中也没有任何内容。所以,这是另一件奇怪的事情。我希望能够看到 一些东西。
无论如何,我希望也许有人 运行 以前遇到过类似的事情,并且可以指出 article/solution/blog 可以阐明这一点并让我找到可行的解决方案。
谢谢!
编辑:添加了浏览器中出现的错误消息的屏幕截图:
编辑:在下面添加了应用抛出异常的行:
responseBytes = client.UploadData(baseAddress, "POST", parms);
尝试执行此行后,它立即跳转到 catch
,但没有出现 WebException。
编辑:我找到了解决方案并将其添加为下面的答案。
我找到了一个有效的解决方案,它只用了一行代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
所以,基本上,我只需要设置 SecurityProtocol。我不知道没有它在本地如何工作,但 运行 Azure 上显然需要设置它。
我有一个非常简单的测试应用程序,它创建一个 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
异常对象。我的意思是,我可以在调试中将鼠标悬停在 ex
变量上,但什么也没有出现。即使将鼠标悬停在 ex.Response
上也不会显示任何内容。因此,由于那里什么都没有(即 ex
似乎不存在,甚至 null
值也不存在),应用程序会出现空引用错误。
我的想法是,也许 Azure 中的某些东西正在阻止 URL,因为我可以在本地 运行 这没有问题。我问过我们这里的网络人员,他们说不应该设置他们知道的任何类型的限制来阻止呼叫出去。奇怪的是,我在 Azure 中为此应用程序打开了诊断日志记录,但没有显示任何内容。即使我可以使用浏览器或 PostMan 访问该应用程序,日志中也没有任何内容。所以,这是另一件奇怪的事情。我希望能够看到 一些东西。
无论如何,我希望也许有人 运行 以前遇到过类似的事情,并且可以指出 article/solution/blog 可以阐明这一点并让我找到可行的解决方案。
谢谢!
编辑:添加了浏览器中出现的错误消息的屏幕截图:
编辑:在下面添加了应用抛出异常的行:
responseBytes = client.UploadData(baseAddress, "POST", parms);
尝试执行此行后,它立即跳转到 catch
,但没有出现 WebException。
编辑:我找到了解决方案并将其添加为下面的答案。
我找到了一个有效的解决方案,它只用了一行代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
所以,基本上,我只需要设置 SecurityProtocol。我不知道没有它在本地如何工作,但 运行 Azure 上显然需要设置它。