绑定不能在"双模式"下工作(webHttpBinding和basicHttpBinding)

Pro*_*m.X 6 wcf

我有一个WCF服务:

<%@ ServiceHost Language="C#" Debug="true" Service="IWW.MIGTurbo2.WCF.Security.SecurityBroker" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"   %>
Run Code Online (Sandbox Code Playgroud)

这可以使用我的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>
Run Code Online (Sandbox Code Playgroud)

标记为WinForms的部分似乎不起作用.我得到一个例外:

' http:// localhost:56125/MIGTurbo2_WEB/api/wcf/SecurityBroker.svc '中的端点没有与None MessageVersion的绑定.'System.ServiceModel.Description.WebHttpBehavior'仅适用于WebHttpBinding或类似绑定.

当我尝试使用IE手动浏览.svc文件时.显然,WinForms客户端不想知道.

任何人都可以透露为什么它不工作?它几乎看起来好像我不能有多个端点或第二个端点没有正确配置?谷歌没有提供任何特别有用的东西.

Bri*_*ian 6

就像异常所说,你的第二个端点有(1)webHttpBehavior和(2)basicHttpBinding,这些都是不兼容的.我想你可能只想从第二个端点删除webHttpBehavior.


Pro*_*m.X 5

答案:

(布莱恩得到了积分,但这是导致它的细节)

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>
Run Code Online (Sandbox Code Playgroud)

我的服务器端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>
Run Code Online (Sandbox Code Playgroud)

我有以下代码在我的客户端应用程序(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");
        }
Run Code Online (Sandbox Code Playgroud)