【问题标题】:WPF Application does not seem to be receiving a responseWPF 应用程序似乎没有收到响应
【发布时间】:2019-12-16 01:58:48
【问题描述】:

我目前有两个独立的项目,一个是带有 .NET Framework 4.7.2 的 WPF 应用程序,另一个是带有 ASP.NET Core 3.1 的控制台应用程序。控制台应用程序也曾经是 .NET 4.7.2,但我刚刚将其移至 Core。

WPF 应用程序向控制台应用程序发送一个对象,控制台应用程序对其进行处理并返回响应。我目前的问题是 WPF 应用程序成功发送对象,控制台应用程序接收它并执行它需要的操作,但是当它发送响应时,WPF 应用程序只是挂起并且必须完全停止。这是两者的代码:

WPF 应用程序(在将控制台移至核心之前运行良好):

static async Task SendRequest(UploadDetails u)
    {
        System.Diagnostics.Debug.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(u));
        HttpResponseMessage response = await _client.PostAsJsonAsync(_clientUrl, u);
        if (response.IsSuccessStatusCode)
        {
            var responseLink = await response.Content.ReadAsStringAsync();
            responseLink = responseLink.Replace("\"", "");
            System.Diagnostics.Debug.WriteLine("SUCCESSFUL UPLOAD"); //TODO: Add response
            Messenger.Default.Send(new NotificationMessage(responseLink));
        }
        else
        {
            System.Diagnostics.Debug.WriteLine("UNSUCCESSFUL UPLOAD"); //TODO: Add response
        }
    }

控制台应用程序(甚至使用邮递员发送正确的响应):

[HttpPost("upload")]
public ActionResult Upload(UploadDetails data)
    {
        try
        {
            Task.Factory.StartNew(() => { _Uploader.Upload(data); });
            return Ok("Started");
        }
        catch (Exception e)
        {
            return NotFound();                
        }
    }

任何帮助将不胜感激。

【问题讨论】:

  • 你能贴出控制台应用程序启动逻辑的代码吗......另外,如果你在“return OK”行放置一个断点,它会被命中吗?
  • 另外请告诉我们调用 SendRequest 的代码
  • Send Request 只是一种标准方法,与任何其他方法一样。它的名称没有什么特别之处。请注意,在我将控制台应用程序更改为 Core 之前,它工作得非常好。还有启动逻辑的哪一部分?是的,它正确返回正常,我提到它与邮递员@Darkonekt 正确返回
  • 我不是在谈论邮递员......可以在此处设置断点“if (response.IsSuccessStatusCode)”并查看响应以查看它是否返回 404。此外,我确实需要查看调用 SendRequest 的方法,因为它是异步的,它必须被正确调用或者它可以导致应用程序由于死锁而挂起
  • 我需要查看整个启动逻辑...我想看看您使用的是哪种控制器...您的路由设置是什么样的等等。

标签: c# wpf .net-4.7.2 asp.net-core-3.1


【解决方案1】:

如果没有更多信息,很难确定实际问题....

但仅通过查看提供的代码,我发现了一个问题:

  1. 您正在发送 JSON,但您的操作并未检查正文。

所以我会做一个改变:

1 你的参数应该有一个属性 [FromBody] 像这样:

    [HttpPost]
    public ActionResult Upload([FromBody] UploadDetails data)

您还必须确保您的 HttpClient 在像这样初始化时具有正确的标头:

 _client.DefaultRequestHeaders.Accept.Clear();
  _client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

我能想到的最后一件事是您在 WPF 应用程序中调用了错误的异步方法....

例如,这会挂在“await _client.PostAsJsonAsync.....”行

private void Button_Click(object sender, RoutedEventArgs e)
{
   SendRequest(new UploadDetails {  }).Wait();
}

这不会挂起:

private async void Button_Click(object sender, RoutedEventArgs e)
{
   await SendRequest(new UploadDetails {  });
}

原因是第一个会阻塞主线程,第二个不会。

但是没有调用 SendRquest 的代码是不可能知道的。

【讨论】:

  • 它已经有 [HttpPost],我刚刚意识到我错过了将它添加到问题中。它也已经成功地从身体中获取信息,邮递员证明了这一点。我正在使用与 WPF 客户端发送的完全一样的邮递员请求进行测试,并且它得到了预期的响应,我现在已经提到过两次了。我还提到 WPF 客户端成功发送请求,并且控制台应用程序确实执行了预期的操作。唯一不起作用的是 WPF 客户端挂在 await _client.PostAsJsonAsync() 上。
  • 所以我需要看一下调用SendRequest方法的代码。此外,您还缺少 [FromBody] 属性...而且您还没有告诉我们您的控制器继承自哪个类...。要在 StackOverflow 上发布问题,您需要发布完全可复制的代码示例...不是只是“您怀疑”的部分,否则我们无法确定问题所在。 @BradE
  • 您还说“WPF 成功发送请求”,所以在“if (response.IsSuccessStatusCode)”行和返回“OK()”行设置断点应该没有问题.... 使用 WPF 不是邮递员。看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 2013-03-13
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多