ServiceStack 5 с .NET Core 3.0 не работает - PullRequest
0 голосов
/ 30 сентября 2019

Не уверен, что кто-то еще имел эту проблему.

У меня есть очень простая служба ServiceStack

public VersionResponse Get(VersionRequest request)
{
   Assembly assembly = Assembly.GetExecutingAssembly();
   FileVersionInfo fvi = FileVersionInfo.GetVersionInfo(assembly.Location);
   return new VersionResponse() { Version = fvi.FileVersion };
}

, которая зарегистрирована в пакете служб следующим образом

appHost.Routes.Add<VersionRequest> ("/api/version");
appHost.RegisterService<CoreService>();

Это работало всегда, но после обновления до. NET Core 3.0 и переход на использование Host Builder в соответствии с инструкциями Microsoft выдает исключение, когда ServiceStack пытается сериализовать ответ на JSON или что-то еще.

Это ошибка, которую мы получаем на сервере (извиняюсь за образ, ноЯ думаю, очевидно, что что-то не так в интеграции ServiceStack + .NET Core 3.0)

fail: ServiceStack.HttpResponseExtensionsInternal[0]
      Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
System.InvalidOperationException: Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.Compression.DeflateStream.WriteDeflaterOutput()
   at System.IO.Compression.DeflateStream.WriteCore(ReadOnlySpan`1 buffer)
   at System.IO.Compression.DeflateStream.Write(Byte[] array, Int32 offset, Int32 count)
   at System.IO.Compression.GZipStream.Write(Byte[] array, Int32 offset, Int32 count)
   at Microsoft.AspNetCore.ResponseCompression.ResponseCompressionBody.Write(Byte[] buffer, Int32 offset, Int32 count)
   at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder)
   at System.IO.StreamWriter.Flush()
   at ServiceStack.Text.JsonSerializer.SerializeToStream(Object value, Type type, Stream stream) in C:\BuildAgent\work\912418dcce86a188\src\ServiceStack.Text\JsonSerializer.cs:line 181
   at ServiceStack.Text.JsonSerializer.SerializeToStream[T](T value, Stream stream) in C:\BuildAgent\work\912418dcce86a188\src\ServiceStack.Text\JsonSerializer.cs:line 174
   at ServiceStack.Serialization.JsonDataContractSerializer.SerializeToStream[T](T obj, Stream stream) in C:\BuildAgent\work\3481147c480f4a2f\src\ServiceStack.Client\Serialization\JsonDataContractSerializer.cs:line 64
   at ServiceStack.Host.ContentTypes.<>c.<.ctor>b__36_0(IRequest r, Object o, Stream s) in C:\BuildAgent\work\3481147c480f4a2f\src\ServiceStack\Host\ContentTypes.cs:line 20
   at ServiceStack.Host.ContentTypes.<>c__DisplayClass30_0.<GetStreamSerializerAsync>b__0(IRequest httpReq, Object dto, Stream stream) in C:\BuildAgent\work\3481147c480f4a2f\src\ServiceStack\Host\ContentTypes.cs:line 273
   at ServiceStack.HttpResponseExtensionsInternal.WriteToResponse(IResponse response, Object result, StreamSerializerDelegateAsync defaultAction, IRequest request, Byte[] bodyPrefix, Byte[] bodySuffix, CancellationToken token) in C:\BuildAgent\work\3481147c480f4a2f\src\ServiceStack\HttpResponseExtensionsInternal.cs:line 323

Кто-нибудь с этой проблемой?

1 Ответ

2 голосов
/ 30 сентября 2019

ServiceStack добавил совместимость с .NET Core 3 в v5.7 . * Первое исправление , похоже, связано:

Синхронная запись отключена по умолчанию

Основная проблема в поддержке .NET Core 3согласился с решением отключить синхронизацию потоковых записей по умолчанию, фактически запретив большинству сериализаторов .NET возможность прямой записи в Response OutputStream. Чтобы обойти это, в .NET Core 3 все синхронизирующие сериализаторы сначала записываются в пул MemoryStream, а затем асинхронно записываются в выходной поток ответа. чем HTML View Engine (Razor / Markdown / JSON Report) и #Script Pages (написанные с нуля для поддержки асинхронных записей) в настоящее время буферизируются в .NET Core 3. (мы рассмотрим расширение поддержки собственной асинхронной сериализации для нашей собственнойСериализаторы в будущем выпуске).

.NET Core 3 позволяет отключить это ограничение для каждого запроса, которым можно управлять, отключив буферизацию синхронизирующих сериализаторов с помощью:

SetConfig(new HostConfig {
    BufferSyncSerializers = false,
})

, который восстанавливает существующее поведение .NET Core 3 для сериализации непосредственно в выходной поток и маркировки запроса с помощью AllowSynchronousIO = true.

Об этом говорит исключениетоже:

Synchronous operations are disallowed. Call WriteAsync or 
set AllowSynchronousIO to true instead.
...