У меня есть приложение службы 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