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».
Я думаю, что мне не хватает чего-то важного в части конфигурации сервера.
Я буду признателен за любую помощь.