NetHttpBinding CoreWCF v1.2.1 не работает в .NET 7

Я пытался использовать CoreWCF v1.2.1 в тестовом приложении .NET 7 C# для проверки функциональности NetHttpBinding в соответствии с информацией, предоставленной по ссылке https://devblogs.microsoft.com/dotnet/corewcf-v1-released/ . Вот конфигурация сервера и лог...

Конфигурация сервера

      var builder = WebApplication.CreateBuilder(args);

Uri uri = new Uri("http://localhost:5100");

builder.Logging.ClearProviders();
builder.Logging.AddConsole();

builder.WebHost.ConfigureKestrel((context, options) =>
{
    options.AllowSynchronousIO = true;
    options.ListenAnyIP(5100, listenOptions =>
    {
        listenOptions.UseConnectionLogging();
    });
});

builder.WebHost.UseKestrel();

var netHttpBinding = new NetHttpBinding(CoreWCF.Channels.BasicHttpSecurityMode.None);
netHttpBinding.WebSocketSettings.TransportUsage = CoreWCF.Channels.WebSocketTransportUsage.WhenDuplex;
netHttpBinding.WebSocketSettings.SubProtocol = "soap";


builder.Services.AddServiceModelServices().AddServiceModelMetadata();
builder.Services.AddSingleton<IServiceBehavior, UseRequestHeadersForMetadataAddressBehavior>();

builder.Services.AddHttpLogging(logging =>
{
    logging.LoggingFields = HttpLoggingFields.RequestBody | HttpLoggingFields.RequestHeaders | HttpLoggingFields.RequestQuery |
                            HttpLoggingFields.ResponseBody | HttpLoggingFields.ResponseHeaders | HttpLoggingFields.ResponseStatusCode;

    logging.RequestHeaders.Add("soap-content-type");
    logging.RequestHeaders.Add("microsoft-binary-transfer-mode");
    logging.RequestHeaders.Add("Sec-WebSocket-Key");
    logging.RequestHeaders.Add("Sec-WebSocket-Protocol");
});

var app = builder.Build();

app.UseHttpLogging();

app.UseServiceModel(builder =>
{
    builder.AddService<TestBroadcast>((serviceOptions) =>{ })

    .AddServiceEndpoint<TestBroadcast, ITestBroadcast>(netHttpBinding, uri);
});
var serviceMetadataBehavior = app.Services.GetRequiredService<ServiceMetadataBehavior>();
serviceMetadataBehavior.HttpGetEnabled = true;

app.UseExceptionHandler("/errors");

app.Run();

Журнал сервера:

      info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
      Request starting HTTP/1.1 GET http://localhost:5100/ - -
trce: Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware[2]
      All hosts are allowed.
dbug: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[7]
      No Content-Type header for request body.
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[1]
      Request:
      QueryString:
      Connection: Upgrade
      Host: localhost:5100
      Upgrade: websocket
      soap-content-type: application/soap+msbinsession1
      microsoft-binary-transfer-mode: Buffered
      Sec-WebSocket-Key: DxUZmQ5k4k6XZg256SD9eA==
      Sec-WebSocket-Version: 13
      Sec-WebSocket-Protocol: soap
info: Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware[2]
      Response:
      StatusCode: 200
      Content-Type: text/html; charset=UTF-8
dbug: Microsoft.AspNetCore.Server.Kestrel.Core.Internal.LoggingConnectionMiddleware[0]
      WriteAsync[3170]
      48 54 54 50 2F 31 2E 31  20 32 30 30 20 4F 4B 0D   HTTP/1.1  200 OK.
      0A 43 6F 6E 74 65 6E 74  2D 54 79 70 65 3A 20 74   .Content -Type: t
      65 78 74 2F 68 74 6D 6C  3B 20 63 68 61 72 73 65   ext/html ; charse
      74 3D 55 54 46 2D 38 0D  0A 44 61 74 65 3A 20 53   t=UTF-8. .Date: S
      61 74 2C 20 31 39 20 4E  6F 76 20 32 30 32 32 20   at, 19 N ov 2022
      31 35 3A 32 39 3A 31 31  20 47 4D 54 0D 0A 53 65   15:29:11  GMT..Se
      72 76 65 72 3A 20 4B 65  73 74 72 65 6C 0D 0A 54   rver: Ke strel..T
      72 61 6E 73 66 65 72 2D  45 6E 63 6F 64 69 6E 67   ransfer- Encoding
      ...
      ...

Согласно журналу сервера кажется, что клиентское приложение правильно отправляет запрос на обновление соединения на сервер, и сервер не может его интерпретировать, поэтому он игнорирует запрос на обновление протокола и возвращает текст html с кодом ответа 200. Как клиентское приложение ожидает
от сервера ответный код 101 (протокол переключения), клиент выдает исключение с сообщением

«Сервер вернул код состояния «200», хотя ожидался код состояния «101».

Я думаю, что мне не хватает чего-то важного в части конфигурации сервера.

Я буду признателен за любую помощь.

0 ответов

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