Ошибка неверного запроса HTTP 400 при попытке добавить веб-ссылку на службу WCF - PullRequest
7 голосов
/ 26 мая 2010

Я пытался перенести устаревшую веб-службу WSE 3 на WCF. Поскольку поддержание обратной совместимости с клиентами WSE 3 является целью, я следовал инструкциям в этой статье .

После долгих проб и ошибок я могу вызвать службу WCF из моего клиента WSE 3. Однако я не могу добавить или обновить веб-ссылку на эту службу из Visual Studio 2005 (с установленным WSE 3). Ответ «запрос не выполнен с HTTP-статусом 400: неверный запрос». Я получаю ту же ошибку при попытке создать прокси с помощью утилиты wsewsdl3. Я могу добавить ссылку на сервис, используя VS 2008.

Я попытался разместить службу в IIS 7.5 на Windows 7 и Windows 2008 Server R2 с тем же результатом. Какие-либо решения или предложения по устранению неполадок?

Вот соответствующие разделы из файла конфигурации для моей службы WCF.

<system.serviceModel>
    <services>
      <service behaviorConfiguration="MyBehavior"
        name="MyService">
        <endpoint address="" binding="customBinding" bindingConfiguration="wseBinding"
          contract="IMyService" />
        <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
      </service>
    </services>

    <bindings>
      <customBinding>
        <binding name="wseBinding">
          <security authenticationMode="UserNameOverTransport" />
          <mtomMessageEncoding messageVersion="Soap11WSAddressingAugust2004" /> 
          <httpsTransport/>
        </binding>
      </customBinding>
    </bindings>

    <behaviors>
      <serviceBehaviors>
        <behavior name="MyBehavior">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
          <serviceCredentials>
            <userNameAuthentication userNamePasswordValidationMode="Custom"
              customUserNamePasswordValidatorType="MyCustomValidator" />
          </serviceCredentials>
          <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="MyRoleProvider" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
  </system.serviceModel>

ОБНОВЛЕНИЕ: После попытки предложения Пола по трассировке я определил, что исключение составляет System.Xml.XmlException: тело сообщения не может быть прочитано, поскольку оно пустое

К сожалению, это не очень помогает. Еще одна вещь, которую я заметил, заключалась в том, что для элемента serviceMetadata был отдельный атрибут httpsGetEnabled. Я добавил это и установил значение true, так как это служба https, но результат был таким же. Кажется, по какой-то причине WCF не признает, что это запрос метаданных.

Ответы [ 2 ]

2 голосов
/ 26 мая 2010

Вы можете попробовать включить трассировку WCF на сервере. Вставьте эту строку перед строкой </system.serviceModel>:

<diagnostics>

    <messageLogging 
     logEntireMessage="true" 
     logMalformedMessages="true" 
     logMessagesAtServiceLevel="true" 
     logMessagesAtTransportLevel="false" 
     maxMessagesToLog ="3000" />

</diagnostics>

Вставьте после строки </system.serviceModel>:

<system.diagnostics>
    <sharedListeners>
        <add name="sharedListener" 
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData="c:\logs\tracelog.svclog" />
    </sharedListeners>
    <sources>
        <source name="System.ServiceModel" switchValue="Verbose, ActivityTracing" >
            <listeners>
                <add name="sharedListener" />
            </listeners>
        </source>
        <source name="System.ServiceModel.MessageLogging" switchValue="Verbose">
            <listeners>
                <add name="sharedListener" />
            </listeners>
        </source>
        <source name="ApplicationLogging" switchValue="Information" >
            <listeners>
                <add name="sharedListener" />
            </listeners>
        </source>
    </sources>
</system.diagnostics>   

После дублирования ошибки запустите инструмент трассировки WCF и откройте файл журнала. Вероятно, произошло какое-то исключение.

- РЕДАКТИРОВАТЬ -

Ну, это интересное сообщение об ошибке. Это приводит к большему количеству результатов Google:

  1. Еще один вопрос о переполнении стека
  2. Может быть исправлено в следующем выпуске Windows 7
  3. TransferMode.StreamedResponse
0 голосов
/ 21 января 2012

Я бы сделал следующее:

<serviceMetadata httpGetEnabled="true" />

изменить на:

<serviceMetadata httpsGetEnabled="true" />

Также. Вы установили свойство привязки HTTPS: http://blogs.msdn.com/b/wenlong/archive/2007/08/02/how-to-change-hostname-in-wsdl-of-an-iis-hosted-service.aspx

...