总结最近两天另人抓狂的WCF跨服务访问问题

本文记录了作者在将WebServer升级为WCF服务过程中遇到的跨服务访问问题,包括需要会话支持的错误、身份验证问题等。通过调整WCF的配置文件和服务行为,成功实现了Session支持。作者分享了关键的代码和配置片段,以帮助遇到类似问题的开发者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先介绍一下开发需求:

应上级要求,需要把以前的WebServer升级为WCF,但是因为单点登录涉及的地方太多,所以,保留单点登录的WebServer服务,也就是我需要用WCF服务去调用以前的WebServer。

这个过程历时至少3天,其中报的错各种各样,我就将一些我还记得的错记录下来,做一个总结,希望对大家有所帮助,尤其是我这种,对WebServer和WCF服务的配置不是很清楚的人

错误:

1、协定需要会话,但是绑定“WSHttpBinding”不支持它或者因配置不正确而无法支持它

2、调用方未由服务器进行身份验证

3、主机XXXXXX和主机XXXXXXXSOAP协议协商失败

4、无法激活服务,因为它需要 ASP.NET 兼容性。没有未此应用程序启用 ASP.NET 兼容性。请在 web.config 中启用 ASP.NET 兼容性或将 AspNetCompatibilityRequirementsAttribute.AspNetCompatibilityRequirementsMode 属性设置为 Required 以外的值。

 

先就记这些吧,一时激动,刚刚好几个错误界面都被关掉了。这里面有个要求是支持Session,我就直接贴源码和配置文件了

服务接口:

[ServiceContract(SessionMode = SessionMode.Required)]
    public interface IMemberService
    {
        #region 会员注册相关
        /// <summary>
        /// 会员注册
        /// </summary>
        /// <param name="MemberType">会员类型</param>
        /// <param name="LoginID">会员注册帐号</param>
        /// <param name="Email">电子邮箱</param>
        /// <param name="Password">登录密码</param>
        /// <param name="ClientIP">客户端IP</param>
        /// <param name="RegSite">注册来源网站</param>
        /// <param name="invitorID">邀请人ID</param>
        /// <param name="userAgent">客户端代理信息</param>
        /// <param name="webExplorer">浏览器版本</param>
        /// <returns>返回注册提示信息</returns>
        [OperationContract]
        string MemberReg(string MemberType, string LoginID, string Email, string Password, string ClientIP, string RegSite, string invitorID,
            string userAgent, string webExplorer);

服务方法:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    [AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Required)]
    public class MemberService : IMemberService
    {
        #region 会员注册相关
        /// <summary>
        /// 会员注册
        /// </summary>
        /// <param name="MemberType">会员类型</param>
        /// <param name="LoginID">会员注册帐号</param>
        /// <param name="Email">电子邮箱</param>
        /// <param name="Password">登录密码</param>
        /// <param name="ClientIP">客户端IP</param>
        /// <param name="RegSite">注册来源网站</param>
        /// <param name="invitorID">邀请人ID</param>
        /// <returns>返回注册提示信息</returns>
        public string MemberReg(string MemberType, string LoginID, string Email, string Password, string ClientIP, string RegSite, string invitorID,
            string userAgent, string webExplorer)
        {

服务配置文件:

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

<!--不支持Session-->
        <binding name="NoneSecurity"
        maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false">
          <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/>
          <security mode="None"/>
        </binding>

<!--支持Session-->
        <binding name="SessionManagementBindingConfiguration" receiveTimeout="00:00:10">
          <reliableSession enabled="true"/>
          <security mode="None">
            <!--此属性控制安全上下文令牌是否通过客户端与服务之间的 WS-SecureConversation 交换建立。将它设置为 true 要求远程方支持 WS-SecureConversation。-->
            <message establishSecurityContext="true"/>
          </security>
        </binding>

      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="WcfSunnHooBaseService.MemberServiceBehavior"
               name="WcfSunnHooBaseService.MemberService">
        <host>
          <baseAddresses>
            <add baseAddress = "http://192.168.1.168/SunnHooBaseService/MemberService" />
          </baseAddresses>
        </host>
        <endpoint address="" binding="wsHttpBinding" contract="WcfSunnHooBaseService.IMemberService"
                  bindingConfiguration="SessionManagementBindingConfiguration" >
          <!--<identity>
            <dns value="localhost"/>
          </identity>-->
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="WcfSunnHooBaseService.MemberServiceBehavior">
          <serviceMetadata httpGetEnabled="true" /><!--httpsGetEnabled="false"-->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

重点我都用红色标记出来了,希望对大家有用,同时希望高手大牛们加注释,解释各个配置节点的含义

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值