WCF XML WebMessageBodyStyle. Эквивалент в NET Core - PullRequest
0 голосов
/ 17 июня 2020

Я сейчас занимаюсь портированием приложения. NET Framework 4.6.2 на. NET Core 3.1. Это приложение размещает службу WCF, которая передает данные XML между сервером и клиентом. Мне нужно получить те же структуры интерфейса / данных в версии. NET Core, поскольку я не могу обновлять всех клиентов, и переход должен быть плавным без необходимых изменений клиентов.

Для Цель этого вопроса Я урезал весь свой интерфейс до самой сути метода, который вызывает у меня проблемы.

Клиенты отправляют методу следующую XML полезную нагрузку:

<int xmlns="http://schemas.microsoft.com/2003/10/Serialization/">104</int>

Интерфейс WCF в NET Framework определяется следующим образом:

[ServiceContract]
public interface WcfServiceInterface
{
    /// <summary>
    /// Processes an integer value sent in an XML body.
    /// </summary>
    /// <param name="theInt">The integer to process.</param>
    /// <returns>True if success, false otherwise</returns>
    [OperationContract]
    [WebInvoke(Method = "DELETE", BodyStyle = WebMessageBodyStyle.Bare, RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml)]
    bool ProcessInteger(int theInt);
}

В NET Core 3.1 класс, обрабатывающий WCF, определяется следующим образом:

[ApiController]
[Produces("application/xml")]
[Route("wcf")]
public class WcfServiceInstance : ControllerBase
{
    /// <summary>
    /// Processes an integer value sent in an XML body.
    /// </summary>
    /// <param name="theInt">The integer to process.</param>
    /// <returns>True if success, false otherwise</returns>
    [Route(nameof(ProcessInteger))]
    public bool ProcessInteger([FromBody] int theInt)
    {
        // ... do something intelligent with the integer
    }
}

Для. NET Framework 4.6.2 vrsion все работает нормально. Однако, когда клиент вызывает тот же метод (с той же полезной нагрузкой сообщения) в. NET Core версии серверного приложения, я получаю следующее исключение:

System.InvalidOperationException: There is an error in XML document (1, 66).
 ---> System.InvalidOperationException: <int xmlns='http://schemas.microsoft.com/2003/10/Serialization/'> was not expected.
   at System.Xml.Serialization.XmlSerializationPrimitiveReader.Read_int()
   at System.Xml.Serialization.XmlSerializer.DeserializePrimitive(XmlReader xmlReader, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   --- End of inner exception stack trace ---
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader)
   at Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
   at Microsoft.AspNetCore.Mvc.Formatters.XmlSerializerInputFormatter.ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
   at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.BindModelAsync(ModelBindingContext bindingContext)
   at Microsoft.AspNetCore.Mvc.ModelBinding.ParameterBinder.BindModelAsync(ActionContext actionContext, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor parameter, ModelMetadata metadata, Object value)
   at Microsoft.AspNetCore.Mvc.Controllers.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<<CreateBinderDelegate>g__Bind|0>d.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeInnerFilterAsync>g__Awaited|13_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
--- End of stack trace from previous location where exception was thrown ---
   at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
   at Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)

Кто-нибудь знает, как исправить это исключение?

Служба создается таким образом в моем. NET Базовом приложении:

using (IHost host = Host.CreateDefaultBuilder().
                         ConfigureWebHostDefaults(webBuilder =>
                                 {
                                     webBuilder.UseUrls(@"http://localhost:8080").
                                                UseStartup<WcfStartup>().
                                                UseShutdownTimeout(new TimeSpan(0, 0, 10));
                                 }).
                         Build())
{
    host.Start();
    Console.WriteLine("Press enter to quit...");

    Console.ReadLine();
    Task stopTask = host.StopAsync();
    stopTask.Wait();
}

Класс WcfStartup определяется следующим образом:

/// <summary>
/// Class to startup the WCF service.
/// </summary>
internal class WcfStartup
{
    public IConfiguration Configuration
    { 
        get;
        private set;
    }

    public void Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    /// <summary>
    /// Configures the services.
    /// </summary>
    /// <param name="services">The service collection to add the required services to.</param>
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc(options =>
                            {
                                options.EnableEndpointRouting = false;
                            }).
                 AddXmlSerializerFormatters();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseMvc();
    }
}
...