Хостинг REST WCF 3.5 на IIS 6 с webHTTPBinding выдает 400 «неверный запрос» и ошибку входа в систему 1380 в журнале IIS - PullRequest
1 голос
/ 16 февраля 2011

Я изучаю WCF и у меня есть следующий код, работающий в моей среде разработки с использованием Visual Studio 2008 и его веб-сервера.Когда я публикую веб-службу в IIS 6, все запросы приводят к ошибке 400 «Bad Request».Глядя на журнал IIS, код состояния равен 400, а код состояния win32 - 1380. Используя net helpmsg 1380, он сообщает, что код состояния wind32 означает « Ошибка входа: пользователю не был предоставлен запрошенный тип входа в систему.на этом компьютере . "Но я использую webHTTPBinding для REST, который не использует метод проверки подлинности или безопасности.

В IIS у меня есть приложение, разрешающее анонимному, который настроен на олицетворение "IUSER_"account. В пуле приложений он настроен на использование идентификатора сетевой службы. Оба пользователя настроены на запись временных папок доступа, а также папок .net framework. Я настроил трассировку WCF, но журналы пустые.Я бьюсь головой о стену. Кто-нибудь может помочь?

System.ServiceModel часть web.config:

 <system.serviceModel>
  <behaviors>
   <endpointBehaviors>
    <behavior name="web">
     <webHttp />
    </behavior>
   </endpointBehaviors>
   <serviceBehaviors>
    <behavior name="default">
     <serviceMetadata />
    </behavior>
   </serviceBehaviors>
  </behaviors>
  <services>
   <service behaviorConfiguration="default" name="GTKK.ServiceLibrary.GTKKService">
    <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding"
     bindingConfiguration="" name="web" contract="GTKK.ServiceLibrary.IGTKKService" />
    <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration=""
     name="mex" contract="IMetadataExchange" />
    <host>
     <baseAddresses>
      <add baseAddress="http://localhost:1173/GTKKService" />
     </baseAddresses>
    </host>
   </service>
  </services>
  <diagnostics>
   <messageLogging logMalformedMessages="true" logMessagesAtServiceLevel="true"
    logMessagesAtTransportLevel="true" />
  </diagnostics>
 </system.serviceModel>

Вот мой сервисный контракт:

using GTKK.DTO;
using System.ServiceModel.Web;

namespace GTKK.ServiceLibrary
{
    [ServiceContract(SessionMode=SessionMode.Allowed)]
    public interface IGTKKService
    {
        [WebGet(UriTemplate = "artist/{id}/json", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        ArtistDTO GetArtistByID(string id);

        [WebGet(UriTemplate = "artists/json?namefilter={namefilter}", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<ArtistDTO> GetArtistListByNameFilter(string nameFilter);

        [WebGet(UriTemplate = "localevents/json?search={searchText}", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
        [OperationContract]
        List<EventDTO> GetLocalEventsBySearchLocationJson(string searchText);

        [WebGet(UriTemplate = "localevents/xml?search={searchText}", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Xml)]
        [OperationContract]
        List<EventDTO> GetLocalEventsBySearchLocationXml(string searchText);
    }
}

В браузере я использую следующий URL для тестирования в своей среде разработки с использованием веб-сервера VS2008, и он работает:

http://localhost:1173/GTKKService/localevents/xml?search=98101

После публикации в IIS и использования следующего URL я получаю неверный запросстраница:

http://<host_name>/service.svc/localevents/xml?search=98101

Я знаю, что URL-адрес должен быть правильным, как если бы я вставил неверный URL-адрес после части .svc, я получу ошибку «Не найдена конечная точка», которая работает так, как должнаНапример:

http://<host_name>/service.svc/anythinghere

На сервере IIS установлены .net 2, 3.0 и 3.5. Веб-приложение IIS настроено на использование .net 2 (который будет использовать .net 3.5). I 'мы также запустили serviceModelReg / i / x, как мыКак и / ia, убедитесь, что WCF установлен и зарегистрирован.Что касается страницы с ошибкой «Bad Request», то это то, что это не страница с ошибками IIS, а HTML, отформатированный как страница с ошибками WCF, с темно-синей полосой вверху с белым заголовком « Request Error »,с последующим сообщением " Сервер обнаружил ошибку при обработке запроса. Дополнительные сведения см. в журналах сервера. "

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 17 февраля 2011

Проблема исправлена.Так как страница ошибки генерируется WCF, я полагаю, что запрос должен быть отправлен на хост службы.Но у меня был журнал событий для любой ошибки, и в журнале событий не было ни одного.Это меня как-то раздражало.Поэтому я добавил еще один OperationContract, который просто возвращает имя сборки и номер версии, и никакой обработки не происходит.При вызове в браузере новая операция вернула данные сборки.Хммм.Так что это работает.Что не так с другими операциями?Чтобы увидеть, что не так с обработкой данных для других, мне пришлось установить удаленную отладку и запустить процесс удаленной отладки.Пришел, чтобы узнать, что это была строка соединения с базой данных, которая дает ошибку входа в систему.Я использовал Integrated Security для подключения к базе данных.Я думал, что он будет использовать действие сетевой службы, которая была настроена для пула приложений.Но, к моему удивлению, при использовании webHTTPBinding без настройки безопасности он использует скрытый домен компьютера acct.Как только я решил проблему с передачей данных, все операции прошли нормально.Кроме того, я обнаружил, что запись в журнал событий не работала из-за отсутствия разрешения на вход в журнал событий.Так что я ничего не получил в журнале событий.Это то, что выбило меня из колеи с самого начала.Ну, я теперь счастливый турист.:)

...