Эта конфигурация WCF вызывает мой 400 неверный запрос? - PullRequest
1 голос
/ 17 января 2012

У меня есть приложение WCF, размещенное как веб-роль в Azure со следующей конфигурацией. Я получаю 400 неверных запросов при попытке доступа к любому из трех сервисов wsdl в браузере или при настройке прокси.

<?xml version="1.0"?>
    <configuration>

        <appSettings>
        </appSettings>

        <system.web>
            <customErrors mode="Off"></customErrors>
            <compilation debug="true" targetFramework="4.0" />
        </system.web>

        <connectionStrings></connectionStrings>

        <system.diagnostics>      
        <sharedListeners> 
          <add name="AzureLocalStorage" type="Example.AzureLocalStorageTraceListener, Example"/> 
        </sharedListeners> 
        <sources> 
          <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing"> 
            <listeners> 
              <add name="AzureLocalStorage" /> 
            </listeners> 
          </source> 
          <source name="System.ServiceModel.MessageLogging" switchValue="Verbose"> 
            <listeners> 
              <add name="AzureLocalStorage" /> 
            </listeners> 
          </source> 
        </sources>  
       </system.diagnostics>

        <system.serviceModel>
            <services>
                <service name="Service1" behaviorConfiguration="MetaBehavior">
                    <endpoint address="http://example.com/service1.svc" binding="basicHttpBinding" name="basicEndpoint1" contract="IService1" />
                </service>
                <service name="Service2" behaviorConfiguration="MetaBehavior">
                    <endpoint address="http://example.com/service2.svc" binding="basicHttpBinding" name="basicEndpoint2" contract="IService2" />
                </service>
                <service name="Service3" behaviorConfiguration="MetaBehavior">
                    <endpoint address="http://pexample.com/service3.svc" binding="basicHttpBinding" name="basicEndpoint3" contract="IService3" />
                </service>
            </services>
            <behaviors>
                <serviceBehaviors>
                    <behavior name="MetaBehavior">
                        <serviceDebug includeExceptionDetailInFaults="true" />
                        <serviceMetadata httpGetEnabled="true"/>
                        <serviceThrottling maxConcurrentSessions="90" />
                    </behavior>
                </serviceBehaviors>
            </behaviors>
            <serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true" />
        </system.serviceModel>

        <system.webServer>
            <modules runAllManagedModulesForAllRequests="true"/>
        </system.webServer>

    </configuration>

Я почти уверен, что моя конфигурация неверна, но мне нужно немного советов о том, что неправильно.

Интерфейс определяется как:

[ServiceContract(Name = "Service1", Namespace = "http://example.com")]
public interface IService1
{
    [WebGet]
    [OperationContract]
    Result Create();
} 

1 Ответ

3 голосов
/ 17 января 2012

Вы используете неправильную привязку, попробуйте webHttpBinding вместо basicHttpBinding. Ваш контракт настроен на WebGet, который WCF берет на основе квази-REST-сервиса. BasicHttpBinding предназначен только для привязок на основе мыла (отсюда и исключение «Неверный запрос»).

EDIT: Поскольку присутствовал WebGet, я предположил, что вам не нужны конечные точки мыла. Ниже приведен конфиг, который поддерживает как мыло, так и WebGet. Я не знаю, чем Azure отличается от стандартного IIS, но вам, вероятно, следует использовать относительные адреса для своей службы. IIS будет поддерживать только относительные адреса в конфигурации службы.

<system.serviceModel>
    <services>
        <service name="Service1" behaviorConfiguration="Service.Behavior">
            <endpoint address="Service1"
                      binding="basicHttpBinding"
                      contract="IService1"
                      bindingNamespace = "http://example.com"
                      bindingConfiguration="HttpBasic" />
            <endpoint address="mexService1"
                      binding="mexHttpBinding"
                      contract="IMetadataExchange"
                      bindingNamespace = "http://example.com"/>
            <endpoint address="webService1"
                      binding="webHttpBinding"
                      behaviorConfiguration="webBehavior"
                      contract="IService1"
                      bindingNamespace = "http://example.com"
                      name="webHttp"
                      listenUriMode="Explicit" />
        </service>
        <service name="Service2" behaviorConfiguration="Service.Behavior">
            <endpoint address="Service2"
                      binding="wsHttpBinding"
                      contract="IService2"
                      bindingNamespace = "http://example.com"
                      bindingConfiguration="HttpStandard" />
            <endpoint address="mexService2"
                      binding="mexHttpBinding"
                      contract="IMetadataExchange"
                      bindingNamespace = "http://example.com"/>
            <endpoint address="webService2"
                      binding="webHttpBinding"
                      behaviorConfiguration="webBehavior"
                      contract="IService2"
                      bindingNamespace = "http://example.com"
                      name="webHttp"
                      listenUriMode="Explicit" />
    </services>     
    <behaviors>
        <endpointBehaviors>
            <behavior name="webBehavior" >
                <webHttp />
            </behavior>
        </endpointBehaviors>
        <serviceBehaviors>
            <behavior name="Service.Behavior">
                <serviceMetadata httpGetEnabled="true"/>
                <serviceDebug includeExceptionDetailInFaults="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <bindings>
        <basicHttpBinding>
            <binding name="HttpBasic" receiveTimeout="00:10:00" maxReceivedMessageSize="2048000">
                <security mode="None"/>
            </binding>
        </basicHttpBinding>
        <wsHttpBinding>
            <binding name="HttpStandard" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2048000">
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
                    <message clientCredentialType="None" negotiateServiceCredential="false" algorithmSuite="Default" establishSecurityContext="false" />
                </security>
            </binding>
            <binding name="Https" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2048000">
                <security mode="Transport">
                    <transport clientCredentialType="None" proxyCredentialType="None" realm="" />
                    <message clientCredentialType="None" negotiateServiceCredential="false" algorithmSuite="Default" establishSecurityContext="false" />
                </security>
            </binding>
            <binding name="HttpsAuthenticated" receiveTimeout="00:10:00" sendTimeout="00:10:00" maxReceivedMessageSize="2048000">
                <security mode="Transport">
                    <transport clientCredentialType="Ntlm" proxyCredentialType="None" realm="" />
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
</system.serviceModel>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...