Я сейчас занимаюсь портированием приложения. 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();
}
}