2

我有一个实现方法的IClientMessageInspector接口BeforeSendRequest()。在这种方法中,我想检索Session客户端中设置的对象。就像是。

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        //Instantiate new HeaderObject with values from ClientContext;
        var dataToSend = new MyCustomHeader
            {
                MyValue = HowDoIGetClientSession["abcValue"];
            };

        var typedHeader = new MessageHeader<CustomHeader>(dataToSend);
        var untypedHeader = typedHeader.GetUntypedHeader("custom-header", "s");

        request.Headers.Add(untypedHeader);
        return null;
    }

我想我需要一些与这个问题非常相似的东西。

4

2 回答 2

0

如果您的客户端应用程序和 WCF 服务都托管在同一个应用程序(实际上是 IIS 中的虚拟应用程序)中,您可以共享会话状态。

但是您需要在 WCF 中启用 ASP.Net 兼容模式(请参阅:https ://msdn.microsoft.com/en-us/library/ms752234.aspx )

如果您的应用程序托管在不同的应用程序中,您仍然可以这样做,但您必须为会话使用外部存储,例如会话状态服务器(在此处查看更多信息:https ://msdn.microsoft.com/en-us/库/ms178586%28v=vs.140%29.aspx)。

以相同的方式进行,但必须在两个 web.config 文件中设置相同的会话存储。

希望能帮助到你。

于 2015-07-24T10:26:42.610 回答
0

我最终使用了本教程中的方法。我将相关信息作为键值对添加到 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进行适当处理并添加到的情况。EndpointBehaiorChannelFactory

    _factory = new ChannelFactory<T>( );
    _factory.Endpoint.Behaviors.Add(new CookieEndpointBehavior(cookieStr));
    _channel = _factory.CreateChannel();

我正在使用服务包装类,一旦超出范围using block就会调用。Dispose

于 2015-08-03T04:02:22.407 回答