Привязка не работает в «двойном режиме» (webHttpBinding и basicHttpBinding) - PullRequest
6 голосов
/ 18 мая 2009

У меня есть сервис WCF:

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

Это отлично работает, используя webHttpBinding из моего веб-проекта.

Я также хочу, чтобы эта служба использовалась клиентом WinForms, поэтому я добавил базовую привязку HttpBinding.

Мой файл конфигурации сервера в данный момент:

<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' не имеет привязки ни с кем MessageVersion. 'System.ServiceModel.Description.WebHttpBehavior' предназначен только для использования с WebHttpBinding или аналогичные привязки.

Когда я пытаюсь найти файл .svc вручную, используя IE. Очевидно, что клиент WinForms не хочет знать.

Может ли кто-нибудь рассказать о том, почему он не работает? Похоже, у меня не может быть более одной конечной точки, или вторая конечная точка настроена неправильно? Google не предлагает ничего особенно полезного.

Ответы [ 3 ]

6 голосов
/ 18 мая 2009

Как говорит исключение, ваша вторая конечная точка имеет (1) webHttpBehavior и (2) basicHttpBinding, и они несовместимы. Я думаю, вы можете просто удалить webHttpBehavior со второй конечной точки.

5 голосов
/ 18 мая 2009

Ответ:

(Брайан получил очки, но именно это и послужило причиной)

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");
        }
2 голосов
/ 30 августа 2012

Первая и самая главная проблема, которую я вижу в вашем конфигурационном файле, связана с настройкой конечных точек.

<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 конечных точек у нас будет тот же адрес и тот же прослушиватель (то есть значения по умолчанию).

Итак, возникает проблема. 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, это будет по умолчанию), так как значения адреса (относительного адреса) различаются, это будет работать нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...