代码之家  ›  专栏  ›  技术社区  ›  Program.X

绑定不在“双模式”下工作(webhttpbinding和basichttpbinding)

wcf
  •  6
  • Program.X  · 技术社区  · 17 年前

    我有WCF服务:

    <%@ ServiceHost Language="C#" Debug="true" Service="IWW.MIGTurbo2.WCF.Security.SecurityBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"   %>
    

    从我的Web项目中使用webhttpbinding可以很好地工作。

    我还希望此服务可由WinForms客户端使用,因此添加了basichttpbinding绑定。

    我的服务器配置文件当前为:

    <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <behaviors>
        <endpointBehaviors>
            <behavior name="webScriptEnablingBehavior">
                <enableWebScript />
            </behavior>
            <behavior name="webHttpEnablingBehaviour">
                <webHttp />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="webHttpEnablingBehaviour">
                <serviceMetadata httpGetEnabled="true" />
            </behavior>
            <behavior name="webScriptEnablingBehavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <services>
        <service name="IWW.MIGTurbo2.WCF.Security.SecurityBroker" behaviorConfiguration="webHttpEnablingBehaviour">
            <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
            <!-- This works for web-clients -->
                        <endpoint address="" 
                binding="webHttpBinding"
                bindingConfiguration="default"
                contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
                    behaviorConfiguration="webHttpEnablingBehaviour">
            </endpoint>
            <!-- This is for WinForms clients, but isn't working -->
                    <endpoint address=""
                binding="basicHttpBinding"
                bindingConfiguration="default"
                contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
                    behaviorConfiguration="webHttpEnablingBehaviour">
            </endpoint>
        </service>
    </services>
    <client />
    <bindings>
        <webHttpBinding>
            <binding name="default" ></binding>
        </webHttpBinding>
        <basicHttpBinding> 
            <binding name="default" allowCookies="true"></binding>
        </basicHttpBinding>
    </bindings>
    

    标记为WinForms的节似乎不起作用。我得到一个例外:

    端点在 ’ http://localhost:56125/MIGTurbo2_WEB/api/wcf/SecurityBroker.svc ’ 没有与“无”绑定 信息传播。 'System.ServiceModel.Description.WebHttpBehavior' 仅用于 webhttpbinding或类似绑定。

    当我尝试使用ie.手动浏览到.svc文件时,显然,winforms客户机不想知道。

    有人能解释一下为什么它不起作用吗?看起来好像我不能有多个端点,或者第二个端点配置不正确?谷歌没有提供特别有用的东西。

    3 回复  |  直到 14 年前
        1
  •  6
  •   Brian    17 年前

    正如异常所说,第二个端点有(1)webhttpbehavior和(2)basichttpbinding,它们是不兼容的。我认为您可能只想从第二个端点删除WebhttpBehavior。

        2
  •  5
  •   Program.X    17 年前

    答案是:

    (布赖恩说得很清楚,但这就是造成这种情况的原因)

    Visual Studio在客户端为我创建了一个“custombinding”元素,但没有什么帮助。为了让它正常工作,我将客户端app.config改为:

        <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="WebHttpBinding_ISecurityBroker" allowCookies="true" />
            </basicHttpBinding>     
        </bindings>
        <client>         
            <endpoint binding="basicHttpBinding" bindingConfiguration="WebHttpBinding_ISecurityBroker"
                contract="Client.API.WCF.ISecurityBroker" name="WebHttpBinding_ISecurityBroker" />
        </client>
    </system.serviceModel>
    

    我的服务器端web.config是:

    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
        <behaviors>
            <endpointBehaviors>
    
                <behavior name="webHttpEnablingBehaviour">
    
                    <webHttp />
                </behavior>
            </endpointBehaviors>
            <serviceBehaviors>
    
                <behavior name="webHttpEnablingBehaviour">
                    <serviceMetadata httpGetEnabled="true" />
                </behavior>
    
            </serviceBehaviors>
        </behaviors>
        <services>
            <service
              name="IWW.MIGTurbo2.WCF.Security.SecurityBroker" behaviorConfiguration="webHttpEnablingBehaviour">
                <endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
    
                <endpoint address="" 
                    binding="webHttpBinding"
                    bindingConfiguration="default"
                    contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
                    behaviorConfiguration="webHttpEnablingBehaviour">
                </endpoint>
                <endpoint address="other"
                    binding="basicHttpBinding"
                    bindingConfiguration="default"
                    contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker">
                </endpoint>
            </service>
    
        </services>
        <client />
        <bindings>
            <webHttpBinding>
                <binding name="default" ></binding>
            </webHttpBinding>
            <basicHttpBinding> 
                <binding name="default" allowCookies="true"></binding>
            </basicHttpBinding>
        </bindings>
    </system.serviceModel>
    

    我有以下代码可以在我的客户机应用程序(WinForms)中连接:

    using (SecurityBrokerClient securityBrokerClient = new SecurityBrokerClient())
            {
                string securityBrokerUrl=url+"api/wcf/SecurityBroker.svc";
                securityBrokerUrl += "/other";
                securityBrokerClient.Endpoint.Address = new System.ServiceModel.EndpointAddress(securityBrokerUrl);
                securityBrokerClient.Open();
                securityBrokerClient.Login(username, password, "MIGTurbo2Admin");
            }
    
        3
  •  2
  •   ЯegDwight kri    14 年前

    我在配置文件中看到的第一个也是最重要的问题是端点配置。

    <endpoint address="" binding="webHttpBinding"  bindingConfiguration="default"
              contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
              behaviorConfiguration="webHttpEnablingBehaviour">
     </endpoint>
    
                <!-- This is for WinForms clients, but isn't working -->
    
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="default"
                contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
                 behaviorConfiguration="webHttpEnablingBehaviour">
     </endpoint>
    

    这里我们没有在标记中指定任何地址和listenuri。因此,我们将拥有这些的默认值,并且对于2个端点,我们将拥有相同的地址和相同的listenuri(即默认值)。

    所以问题来了。 1。不能使用具有相同listenuri和相同地址的不同类型的绑定。但是在您的情况下,当您为地址指定空值时,两个端点将具有相同的值。

    决议: 1。为两个端点指定不同的地址,而不是将其保留为空。

    <endpoint address="Rest" binding="webHttpBinding"  bindingConfiguration="default"
              contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
              behaviorConfiguration="webHttpEnablingBehaviour">
     </endpoint>
    
                <!-- This is for WinForms clients, but isn't working -->
    
     <endpoint address="WebForm" binding="basicHttpBinding" bindingConfiguration="default"
                contract="IWW.MIGTurbo2.WCF.Security.ISecurityBroker"
                 behaviorConfiguration="webHttpEnablingBehaviour">
     </endpoint>
    

    因此,即使我们使用不同的绑定和相同的listenuri(如果我们不指定listenuri,它将是默认的),因为地址(相对地址)值不同,它也可以正常工作。

    推荐文章