Доступ к HttpContext.Current из инспектора сообщений для асинхронных вызовов WCF - PullRequest
0 голосов
/ 07 февраля 2019

Преамбула: в нашем приложении есть логика, основанная на инспекторе пользовательских сообщений.Он анализирует сообщения WCF и устанавливает данные (сеанс или файлы cookie) в текущем контексте Http через HttpContext.Current.
Ситуация: после переключения на асинхронные вызовы WCF мы потеряли доступ к текущему контексту, который на данный момент равен null.Я понимаю, что контекст действительно сохранен и поток уничтожен, пока await выполняет свою работу, но, возможно, есть способ исправить это с меньшим количеством крови и без опасных методов?

Upd: вот некоторый код.Синхронизация ver:

public ActionResult Task()
{
//some logic
var result = ourService.DoCall();
//some logic
}
//in WCF message inspector
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var request = HttpContext.Current; //got context here
}

Async ver:

public async Task<ActionResult> Task()
{
//some logic
var result = await ourService.DoCallAsync();
//some logic
}
//in WCF message inspector
public void AfterReceiveReply(ref Message reply, object correlationState)
{
var request = HttpContext.Current; //got null
}

1 Ответ

0 голосов
/ 08 февраля 2019

Небольшое примечание о WCF: при размещении службы WCF, работающей на сайте ASP.NET, вам необходимо включить режим aspnetCompatability, это можно сделать в Wen.config

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
</system.serviceModel>

или по отдельности науровень обслуживания, используя

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculatorSession
{//Implement calculator service methods.}

Вы можете проверить подробности со страницы Microsoft , это должно дать вам больше информации о режиме. Включение этого позволит WCF работать под ASP.NET конвейер вместо создания модулей для подключения к событиям конвейера, это также позволит вам получить доступ к объекту HttpContext, который в противном случае будет нулевым, если параметр не включен

Квота из указанной статьи:

HttpContext: ток всегда равен нулю при доступе из службы WCF.Вместо этого используйте RequestContext.


Значение RequestContext может быть нулевым.Поскольку роль контекста запроса состоит в том, чтобы связывать запросы с ответами, не имеет смысла иметь контекст запроса, когда у вас нет ответа, и поэтому в этом случае контекст устанавливается в нуль.Для односторонней операции поверх модели запрос / ответ сервер получает запросы, но не отправляет ответ клиенту.Поэтому, если RequestContext неожиданно равен нулю, сначала проверьте, является ли контракт операции IsOneWay.

Qouted from https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.channels.requestcontext?view=netframework-4.7.2

Контекст запроса равен нулю, когда односторонний ответ указан на OperationContract заголовок.

RequestContext можно получить с помощью

rcontext = operationContext.RequestContext
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...