【问题标题】:WebClient Request in Console Application doesn't hit method when published控制台应用程序中的 WebClient 请求在发布时未命中方法
【发布时间】: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


【解决方案1】:

在控制台应用程序代码的末尾,我正在尝试发出 Web 请求

可能是因为本地请求足够快,可以在控制台应用程序关闭之前执行,而不是在它发布时执行?

尝试await client.UploadValuesTaskAsync(uri, "POST", new NameValueCollection());client.UploadValues(uri, "POST", new NameValueCollection()); 它不应该让控制台应用程序在请求结束之前关闭。

【讨论】:

  • 我使用了一段时间,结果相同(在本地工作正常,在其他地方不行)。 UploadValuesTaskAsync 是一天结束时想要的电话。
  • 您尝试过同步版本UploadValues 吗?如果请求得到响应,您需要记录。
  • 如果你要使用异步调用,你真的需要await 那个调用。您现在拥有它的方式会在 UploadValuesAsync 和处理您的 WebClient 之间产生竞争条件。
  • @DevNoob 我之前使用的是UploadValues而不是异步调用,我得到了相同的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
相关资源
最近更新 更多