【发布时间】:2020-01-24 22:07:41
【问题描述】:
基本设置是这样的:我有一个 MVC 应用程序,它根据用户输入启动控制台应用程序。可以这么说,在控制台应用程序代码的末尾,我试图发出一个 Web 请求来通知系统控制台应用程序已完成执行。现在,当我在本地调试和运行时,我点击 web API 方法没有问题。
但是,当我发布 MVC 应用程序并将其复制到服务器时(在相应的 wwwroot 文件夹中,它停止工作。
生成请求的代码比较简单:
public void SendRequest(Uri uri)
{
using(var client = new WebClient())
{
// previously I was sending data, but this works locally regardless of the last parameter
// also, an example of a URI would be something like 'http://localhost:666/Ctrl/SomeFunction' though 'Ctrl' is replaced by the name of the controller
client.UploadValuesAsync(uri, "POST", new NameValueCollection());
}
}
那么端点函数是非常简单的(主要是为了这个问题):
public JsonResult SomeFunction()
{
// do stuff
}
我记录了 Web 请求周围的代码,以查看它是否引发了任何异常,以及控制器方法中的其他调试代码。它不会抛出任何错误,不会遇到任何异常,并且在本地运行良好。我不确定我错过了什么。
就避免任何 SSL 错误而言,这是由我使用的团队成员建议的
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;。我知道这远非理想,通常应该避免,但现在,必须这样做。
更新:我使用了 UploadValues 并检查了响应。它返回了一些看起来像是身份验证重定向的 HTML。所以现在的想法是弄清楚如何从身份验证中排除该路由。到目前为止,控制器上的 [AllowAnonymous] 属性没有帮助(或者通常与 [Authorize] 属性混淆)。团队成员给我的建议是在 Startup.Auth.Cs 文件中删除对该控制器操作的授权。我不确定是否有更好的方法。我可能会就此发表第二个问题。
【问题讨论】:
-
在部署控制台应用程序时是否更新了 URI 以指向 IIS 网站?您在 IIS 中托管的网站上的绑定是什么?
-
@ryancdotnet 这是正确的
-
你没有在等待
UploadValuesAsync,这意味着WebClient在方法有机会执行之前就被释放了。将void SendRequest改为async Task SendRequest,依次等待it -
@PanagiotisKanavos 我用更多信息更新了这个问题。即使使用同步调用,它也无法正常工作。问题在于权限。
-
@Dortimer 只处理 一个 错误。下一个问题是您不知道调用是否有效,因为 UploadValues 不返回响应。只是不要使用 WebClient,它已经过时了。将 HttpClient 与 PostAsync 一起使用并检查响应。你得到什么状态码?如果身份验证错误,服务器将发送 401 或 403
标签: c# asp.net-mvc asp.net-web-api webclient