Недопустимый XML-файл чтения символов из службы Azure ServiceFabric

Когда я добавляю Swagger (v2.5) в любой сервис Web Api моего кластера Azure ServiceFabric, и файл документации swagger содержит знаки ударения (á, é, í...), я получаю эту ошибку:

Invalid character in the given encoding

Я передавал URI (путь) XML-файла Swagger:

services.AddSwaggerGen(options =>
{
    ...
    options.IncludeXmlComments(myxmlpath);
    ...
}

Но согласно этому посту я должен передать StreamReader, чтобы указать кодировку, поэтому я поменял местами код для этого:

services.AddSwaggerGen(options =>
{
    ...
    options.IncludeXmlComments(() => new XPathDocument(
                    new StreamReader(myxmlpath, Encoding.UTF8)));
    ...
}

Таким образом, мне удалось избежать ошибки, но в пользовательском интерфейсе я вижу странные символы. Например, вместо áéíóú это показывает:

Я не понимаю, почему это работает в моем локальном кластере, но это дает мне проблемы с кодированием в моем кластере Azure. Мне не удалось воспроизвести ошибку в моем локальном кластере.

Почему анализ файла каким-либо образом зависит от узла, на котором развернута служба (локальная или Azure)?

Это вся моя трассировка стека перед заменой кода:

Unhealthy event: SourceId='System.RA', Property='ReplicaOpenStatus', HealthState='Warning', ConsiderWarningAsError=false.
Replica had multiple failures during open on mynode01. API call: IStatelessServiceInstance.Open(); Error = System.Xml.XmlException (-2146232000)
Invalid character in the given encoding. Line 35, position 12.
   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.InvalidCharRecovery(Int32& bytesCount, Int32& charsCount)
   at System.Xml.XmlTextReaderImpl.GetChars(Int32 maxCharsCount)
   at System.Xml.XmlTextReaderImpl.ReadData()
   at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars)
   at System.Xml.XmlTextReaderImpl.ParseText()
   at System.Xml.XmlTextReaderImpl.ParseElementContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XPath.XPathDocument.LoadFromReader(XmlReader reader, XmlSpace space)
   at System.Xml.XPath.XPathDocument..ctor(String uri, XmlSpace space)
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions.<>c__DisplayClass31_0.b__0()
   at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenOptions.CreateSwaggerProvider(IServiceProvider serviceProvider)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.Internal.ActivatorUtilities.ConstructorMatcher.CreateInstance(IServiceProvider provider)
   at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass4_0.b__0(RequestDelegate next)
   at Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder.Build()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.StartAsync(CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Hosting.Internal.WebHost.Start()
   at Microsoft.ServiceFabric.Services.Communication.AspNetCore.AspNetCoreCommunicationListener.OpenAsync(CancellationToken cancellationToken)
   at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.OpenCommunicationListenersAsync(CancellationToken cancellationToken)
   at Microsoft.ServiceFabric.Services.Runtime.StatelessServiceInstanceAdapter.System.Fabric.IStatelessServiceInstance.OpenAsync(IStatelessServicePartition partition, CancellationToken cancellationToken)
For more information see: http://aka.ms/sfhealth

1 ответ

Решение

Я наконец нашел проблему. Это не было проблемой в среде Azure. У меня был шаг выпуска в VSTS Replace Tokens с Files Encoding вариант в auto, Я изменил это на utf-8 и это работает!

h ttps://stackru.com/images/1fa743704871e72fef249ee0aa9e96ee1d3170d1.png

Другие вопросы по тегам