Приложение перестает работать при вызове Http.PostAsyn c при возврате строки - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть приложение Blazor, которое вызывает метод WebAPI, который возвращает строку, однако при запуске он просто останавливается. Приложение остается открытым, но, похоже, ничего не происходит.

Когда я помещаю точку останова в контроллер, она запускается.

var ms = new System.IO.MemoryStream();
await file.Data.CopyToAsync(ms);

status = $"Finished loading {file.Size} bytes from {file.Name}";

var content = new MultipartFormDataContent {
  { new ByteArrayContent(ms.GetBuffer()), "\"upload\"", file.Name }
};

string featureImage = await Http.PostAsync("api/Blog/ReturnString", content).Result.Content.ReadAsStringAsync();

Выше приведен код, который вызывает метод WebAPI. Ниже находится Контроллер, который возвращает очень простую строку.

[Authorize]
[HttpPost("[action]")]
public async Task<string> ReturnString()
{
    return "123456";
}

1 Ответ

1 голос
/ 14 февраля 2020

Помимо комментария от @ enet, вероятно, есть еще две ошибки:

  1. Существует риск мертвой блокировки при получении Result при использовании .Result.Content. Вам нужно изменить код на await ...
  2. Также, если вы используете сервер Blazor, учтите, что вызов Http в приложении Blazor ServerSide отличается от приложения Blazor WebAssembly. Вам нужно создать свой собственный HttpClient или внедрить его, а затем предоставить базовый URI для него.

Надеюсь, что поможет следующее:

(если вы используете Blazor ServerSide) зарегистрируйтесь HttpClient сопутствующие услуги при запуске:

services.AddHttpClient();   // only if you're using Blazor ServerSide

И внутри вашего компонента / страницы Blazor:

<b>@using System.Net.Http</b>              
<b>@inject IHttpClientFactory HttpClientFactory</b>   @*if you're using Blazor ServerSide*@
<b>@inject NavigationManager navMgr</b>               @*if you're using Blazor ServerSide*@


@code{
    <b>var Http = HttpClientFactory.CreateClient();</b>    //if you're using Blazor ServerSide
    <b>Http.BaseAddress = new Uri(navMgr.BaseUri);</b>     //if you're using Blazor ServerSide
    // ... add credentials if you're using Blazor ServerSide

    //... your code

    // don't block it by access the`.Result` property, await it!
    <strike>await Http.PostAsync("api/Blog/ReturnString", content).Result.Content.ReadAsStringAsync();</strike>
    <b>var resp= await Http.PostAsync("api/Blog/ReturnString", content);</b>
    var featureImage = await resp.Content.ReadAsStringAsync();

Наконец, если приведенный выше код не решает проблему, не могли бы вы нажать F12 в браузере и показать нам сообщение об ошибке?

...