В итоге я использовал подход, как в this tutorial. Я добавляю соответствующую информацию в cookie как пары ключ-значение и читаю ее в реализации службы. Вместо ссылки на службу я использую ChannelFactory
, но в основном основная идея такая же, как в учебнике.
Мой BeforeSendRequest
метод:
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,
System.ServiceModel.IClientChannel channel)
{
HttpRequestMessageProperty httpRequestMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name
, out httpRequestMessageObject))
{
httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
if (string.IsNullOrEmpty(httpRequestMessage.Headers["Cookie"]))
{
httpRequestMessage.Headers["Cookie"] = cookie;
}
}
else
{
httpRequestMessage = new HttpRequestMessageProperty();
httpRequestMessage.Headers.Add("Cookie", cookie);
request.Properties.Add(HttpRequestMessageProperty.Name
, httpRequestMessage);
}
return null;
}
связывания параметров является:
<basicHttpBinding>
<binding name="basicHttp" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="20000000" maxBufferSize="20000000" maxReceivedMessageSize="20000000"
textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"
messageEncoding="Text">
<readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
В клиентском приложении мне нужно (в web.config
system.serviceModel
):
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
И в аннотация для класса реализации службы:
[AspNetCompatibilityRequirements(RequirementsMode =
AspNetCompatibilityRequirementsMode.Required)]
public class MyService : IMyService {
// ...
}
Для обслуживания вызовов Я использую объект-оболочку, которая реализует IDisposable
, берет случай надлежащей утилизации и добавив к EndpointBehaior
в ChannelFactory
перед созданием канала.
_factory = new ChannelFactory<T>();
_factory.Endpoint.Behaviors.Add(new CookieEndpointBehavior(cookieStr));
_channel = _factory.CreateChannel();
Я использую класс обертку службы в using block
, который будет вызывать Dispose
после того, как она выходит из области видимости.
проверьте, есть ли у вас внутри объекта HttpContext. –
Вы имеете в виду тело метода 'BeforeSendRequest'? У меня нет или я не знаю, как это прочитать. 'HttpContext.Current' имеет значение NULL. – DDan
для 'WCF' Я думаю, что это' OperationContext'. –