Как лучше диагностировать службу WCF, когда операция возвращает мета-страницу html? - PullRequest
4 голосов
/ 26 августа 2011

У меня есть приложение службы WCF (wsHttpBinding), размещенное в IIS7.5 (.NET 4), и я могу перемещаться по файлу .svc в браузере, и страница метаданных успешно отображается, и клиенты могут генерироваться из wsdl.

Я добавил свое собственное поведение службы для регистрации необработанных исключений («ErrorHandling» ниже), и я использую MembershipProvider для учетных данных службы.Вот моя полная конфигурация system.serviceModel:

<system.serviceModel>
  <diagnostics wmiProviderEnabled="true">
    <messageLogging
      logEntireMessage="true"
      logMalformedMessages="true"
      logMessagesAtServiceLevel="true"
      logMessagesAtTransportLevel="true"
      maxMessagesToLog="3000"
      maxSizeOfMessageToLog="-1" />
  </diagnostics>
  <extensions>
    <behaviorExtensions>
      <add name="ErrorHandling" type="MyCompany.MyProduct.Services.ErrorHandlerBehavior, MyCompany.MyProduct.Services" />
    </behaviorExtensions>
  </extensions>
  <services>
    <service name="MyCompany.MyProduct.Services.ApplicationService" behaviorConfiguration="MyProductServiceBehavior">
      <endpoint bindingConfiguration="MyProductWsHttpBinding" binding="wsHttpBinding" contract="MyCompany.MyProduct.Services.IApplicationService" />
    </service>
    <service name="MyCompany.MyProduct.Services.AccountService" behaviorConfiguration="MyProductServiceBehavior">
      <endpoint bindingConfiguration="MyProductWsHttpBinding" binding="wsHttpBinding" contract="MyCompany.MyProduct.Services.IAccountService" />
    </service>
    <service name="MyCompany.MyProduct.Services.InvoiceService" behaviorConfiguration="MyProductServiceBehavior">
      <endpoint bindingConfiguration="MyProductWsHttpBinding" binding="wsHttpBinding" contract="MyCompany.MyProduct.Services.IInvoiceService" />
    </service>
    <service name="MyCompany.MyProduct.Services.ReportService" behaviorConfiguration="MyProductServiceBehavior">
      <endpoint bindingConfiguration="MyProductWsHttpBinding" binding="wsHttpBinding" contract="MyCompany.MyProduct.Services.IReportService" />
    </service>
    <service name="MyCompany.MyProduct.Services.PaymentService" behaviorConfiguration="MyProductServiceBehavior">
      <endpoint bindingConfiguration="MyProductWsHttpBinding" binding="wsHttpBinding" contract="MyCompany.MyProduct.Services.IPaymentService" />
    </service>
  </services>
  <bindings>
    <wsHttpBinding>
      <binding name="MyProductWsHttpBinding">
        <security mode="Message">
          <message clientCredentialType="UserName" establishSecurityContext="true" negotiateServiceCredential="true" />
        </security>
      </binding>
    </wsHttpBinding>
  </bindings>
  <behaviors>
    <serviceBehaviors>
      <behavior name="MyProductServiceBehavior">
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
        <serviceCredentials>
          <serviceCertificate findValue="MyProductServices" storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" />
          <userNameAuthentication userNamePasswordValidationMode="MembershipProvider" membershipProviderName="AspNetSqlMembershipProvider" />
        </serviceCredentials>
        <ErrorHandling />
        <serviceSecurityAudit auditLogLocation="Application" suppressAuditFailure="false" serviceAuthorizationAuditLevel="SuccessOrFailure" messageAuthenticationAuditLevel="SuccessOrFailure" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
</system.serviceModel>

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

У меня также включена трассировка следующим образом:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel"
            switchValue="All"
            propagateActivity="true" >
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
    <source name="System.ServiceModel.MessageLogging" switchValue="All">
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
    <source name="myUserTraceSource"
            switchValue="Information, ActivityTracing">
      <listeners>
        <add name="xml"/>
      </listeners>
    </source>
  </sources>
  <sharedListeners>
    <add name="xml"
         type="System.Diagnostics.XmlWriterTraceListener"
               initializeData="C:\Users\Public\Documents\services.svclog" />
  </sharedListeners>
</system.diagnostics>

Когда клиент вызывает основную операцию в первичнойслужба получает исключение протокола с этим сообщением:

Тип содержимого text / html;charset = UTF-8 ответного сообщения не соответствует типу содержимого привязки (application / soap + xml; charset = utf-8).При использовании пользовательского кодировщика убедитесь, что метод IsContentTypeSupported реализован правильно.Первые 1024 байта ответа были: '#content {FONT-SIZE: 0.7em;Нижняя часть: 2em;MARGIN-LEFT: 30px} ТЕЛО {MARGIN-TOP: 0px;MARGIN-LEFT: 0px;ЦВЕТ: # 000000;Шрифтовая семья: Вердана;ЦВЕТ ФОНА: белый} P {MARGIN-TOP: 0px;Дно: 12px;ЦВЕТ: # 000000;FONT-FAMILY: Verdana} PRE {ПРАВО ГРАНИЦЫ: # f0f0e0 1px solid;ВПРАВО-ПРАВО: 5px;BORDER-TOP: # f0f0e0 1px solid;MARGIN-TOP: -5px;PADDING-LEFT: 5 пикселей;Размер шрифта: 1.2em;Нижняя часть: 5px;ГРАНИЦА-ВЛЕВО: # f0f0e0 1px solid;PADDING-TOP: 5 пикселей;Дно границы: # f0f0e0 1px solid;FONT-FAMILY: Курьер Новый;ЦВЕТ ФОНА: # e5e5cc} .heading1 {MARGIN-TOP: 0px;PADDING-LEFT: 15 пикселей;Вес шрифта: нормальный;Размер шрифта: 26 пикселей;Дно: 0px;Нижняя часть: 3 пикселя;MARGIN-LEFT: -30px;ШИРИНА: 100%;ЦВЕТ: #ffffff;PADDING-TOP: 10 пикселей;Шрифтовая семья: Tahoma;BACKGROUND-COLOR: # 003366} .intro {MARGIN-LEFT: -15px} Служба ApplicationService '.

HTML-код страницы метаданных, которую вы видите, когда переходите к файлу .svc.Таким образом, создается впечатление, что служба возвращает эту страницу в качестве ответа на операцию.

Просмотр services.svclog рассказывает ту же историю, на самом деле журнал имеет неправильный формат XML, поскольку этот ответ включен в него без тегов.быть сбежавшимТам нет никакой полезной информации, что когда-либо в трассировке.

Нет никаких исключений на сервере, журналы не имеют ничего.Это все работает на IIS6 на другом сервере, который я настроил только для того, чтобы проверить его, и там также работает регистрация ошибок.

Какие инструменты и методы могут помочь мне выяснить, в чем заключается проблема с корнем?

ОБНОВЛЕНИЕ: Вот svclog от трассировки на стороне сервера, выполненной для одного запроса от недавно сгенерированного клиента консольного приложения (очищенного для удаления личной информации), обратите внимание, как он усекается вконец: http://pastebin.com/mksL0FFY

Ответы [ 2 ]

1 голос
/ 07 сентября 2011

Поскольку журнал событий пуст, вы должны проверить журнал IIS, чтобы убедиться, что вызов выполнен успешно. Я сталкивался с подобными сообщениями об ошибках, и проблема обычно была связана с разрешениями. Убедитесь, что учетные записи, используемые для пула приложений и веб-сайта, имеют достаточные привилегии. Я думаю, что вы увидите сообщение журнала событий, если возникла проблема с аутентификацией у поставщика членства. Также попробуйте вызвать метод с помощью приложения WcfTestClient, чтобы вы могли видеть, как XML передается в каждую сторону.

0 голосов
/ 08 сентября 2011

Проверьте правила перезаписи URL в IIS для сайта. Если один из них перенаправляет, это может привести к тому, что клиенты получат страницу метаданных в ответ на операцию. Я видел это раньше, это может ввести в заблуждение.

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