Могу ли я использовать клиент Autorest в Blazor
Я получаю System.PlatformNotSupportedException
с моно платформы при попытке запустить мое приложение Blazor на веб-сборке. Я автоматически создал клиент веб-API с помощью Autorest. Все компилируется нормально, но когда я загружаю код в браузер, я получаю сообщение об ошибке ниже в консоли браузера.
Использование предварительной сборки VS2017.
module.printErr @ MonoPlatform.ts:192
WASM: [System.PlatformNotSupportedException] Operation is not supported on this platform.
WASM: at System.Net.WebProxy.CreateDefaultProxy () <0x204ed08 + 0x00004> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetSystemWebProxy () <0x204ebc0 + 0x00000> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetDefaultProxy_UsingOldMonoCode () <0x204ea80 + 0x00000> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Configuration.DefaultProxySectionInternal.GetSection () <0x204e8c8 + 0x00022> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.WebRequest.get_InternalDefaultWebProxy () <0x204e610 + 0x0002c> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.HttpWebRequest..ctor (System.Uri uri) <0x2043eb0 + 0x000d2> in <1c80af700ca2462a80a92d89ad803d6a>:0
WASM: at System.Net.Http.HttpClientHandler.CreateWebRequest (System.Net.Http.HttpRequestMessage request) <0x20434d0 + 0x00016> in <3a9393eaef104ec489024eb855a8f163>:0
WASM: at System.Net.Http.HttpClientHandler+<SendAsync>d__64.MoveNext () <0x203ea60 + 0x00076> in <3a9393eaef104ec489024eb855a8f163>:0
WASM: --- End of stack trace from previous location where exception was thrown ---
...
2 ответа
Да, это возможно. Но вы должны использовать HttpClient, который внедряется средой Blazor, как описано здесь:
https://learn-blazor.com/architecture/rest-api/
(спасибо за ссылку Flores!)
HttpClient помечен как защищенный в Microsoft.Rest.ServiceClient, который используется Autorest. Таким образом, чтобы внедрить HttpClient из Blazor, вы можете создать новый фрагмент автоматически сгенерированного класса клиента и добавить SetHttpClient
метод:
Класс, сгенерированный autorest:
public partial class YourApi : ServiceClient<YourApi>, IYourApi
{
...
}
Ваш новый частичный:
public partial class YourApi
{
public void SetHttpClient(HttpClient client) {
this.HttpClient = client;
}
}
Красиво и просто!
Приложения Blazor/webassembly запускаются в изолированной программной среде браузера и поэтому ограничены сетевыми возможностями браузера. Это означает, что весь сетевой трафик должен проходить через систему сетевых запросов браузера.
Похоже, что он пытается использовать прокси.. который не поддерживается.
Теперь намного проще, используя Refit.
const string baseUri = "http://localhost:55088/";
services.AddRefitClient<IApiService>()
.ConfigureHttpClient(c => c.BaseAddress = new Uri(baseUri))
.ConfigurePrimaryHttpMessageHandler(() => new BrowserMessageHandler());
Конечно, вы все еще должны выполнить свою собственную сериализацию / десериализацию, но я использую эти расширения, чтобы я мог также получить доступ к HttpResponseMessage, когда это необходимо.
public static async Task<T> As<T>(this Task<HttpResponseMessage> task)
{
var response = await task.ConfigureAwait(false);
return await response.As<T>();
}
public static async Task<T> As<T>(this HttpResponseMessage message)
{
var json = await message.Content.ReadAsStringAsync();
return Json.Deserialize<T>(json);
}
Я надеюсь, что это делает чью-то жизнь немного легче, чем была до того, как я все это заработал!