Подключиться к защищенному паролем серверу с WCF через HTTP - PullRequest
2 голосов
/ 29 августа 2011

Привет,

Мне нужно подключить мое приложение ASP.NET MVC к серверу в сети с WCF.Сервер защищен именем пользователя и паролем, но похоже, что это не https, а простой http.

Это код, который у меня есть:

public MyObject GetMyData(string id)
{
    ChannelFactory<MyIService> factory;
    ClientCredentials loginCredentials = new ClientCredentials();

    loginCredentials.UserName.UserName = "MyName";
    loginCredentials.UserName.Password = "MyPassword";

    factory = new ChannelFactory<ICFService>("MyData");

    var defaultCredentials = factory.Endpoint.Behaviors.Find<ClientCredentials>();
    factory.Endpoint.Behaviors.Remove(defaultCredentials); //remove default ones
    factory.Endpoint.Behaviors.Add(loginCredentials); //add required ones

    var proxy = factory.CreateChannel();
    var response = proxy.GetMyData(id);
    ((IDisposable)proxy).Dispose();

    return response as MyObject ;
}

И он помещен в мойweb.config

  <system.serviceModel>
    <client>
      <endpoint address="http://MyUrl/"
                binding="webHttpBinding"
                behaviorConfiguration="MyData"
                contract="MyNameSpace.MyIService"
                name="MyData"/>
    </client>
    <behaviors>
      <endpointBehaviors>
        <behavior name="MyData">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>

  </system.serviceModel>

Проблема в том, что я получаю следующее исключение:

Удаленный сервер возвратил ошибку: (401) Не авторизован.Описание: во время выполнения текущего веб-запроса произошло необработанное исключение.Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.Сведения об исключении: System.Net.WebException: удаленный сервер возвратил ошибку: (401) Несанкционировано.

Я знаю, что сервер, с которым я пытаюсь установить связь, будет связываться, только если мое приложение помещенона конкретном IP-адресе, но это уже сделано и должно работать.

Совет по просьбе

Edit1:

Этокак выглядит сервис:

[ServiceContract]
[XmlSerializerFormat]
public interface ICFService
{
    [OperationContract]
    [WebGet(BodyStyle = WebMessageBodyStyle.Bare, 
        ResponseFormat = WebMessageFormat.Xml, 
        UriTemplate = "get?UID=12345.eu_vddsall_xml&MyId={MyId}&LANG=en")]
    CFExtendedDescription GetMyData(string MyId);

}

Edit2: Так выглядит диалоговое окно при просмотре URL-адреса в Firefox.Я не уверен, как проверить фактический URL, который будет использовать Proxy.GetMyData.

AccessDenied Обратите внимание, это пример, адрес, а "Сайт говорит" это что-то еще.

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

http://bat.myserver.com/ag/get?UID=12345.eu_vddsall_xml&MyId=WRH421&LANG=sv

Edit3: Добавив foolowing в web.config, мы получили шагforward (спасибо Ladislav Mrnka):

<bindings>
  <webHttpBinding>
    <binding name="secured">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Basic" />
      </security>
    </binding>
  </webHttpBinding>
</bindings>

Теперь вместо этого мы получаем следующее исключение:

Невозможно десериализовать тело XML с корневым именем 'Binary' и корневым пространством имен '' (для операции 'GetMyData' и контракта ('ICFService', 'http://tempuri.org/')) с использованием XmlSerializer. Убедитесь, что тип, соответствующий XML, добавлен в коллекцию известных типов службы. Описание: во время выполнения возникло необработанное исключениетекущего веб-запроса. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде. Сведения об исключении: System.Runtime.Serialization.SerializationException:Невозможно десериализовать тело XML с корневым именем «Binary» и корневым пространством имен »(для операции« GetMyData »и контракта (« ICFService »,« http://tempuri.org/')) с использованием XmlSerializer).Убедитесь, что тип, соответствующий XML, добавлен в коллекцию известных типов службы.

Сначала я подумал, что maby удаленного сервера возвратил документ xml, который показывает, что я на неправильном IP, такЯ загрузил сайт на правильный сервер (с правильным ip), но у меня там тоже самое исключение?

Изменить 4

Создан новый вопрос: Не удается десериализовать тело XML с корневым именем 'Binary' и корневым пространством имен?

Спасибо Ladislav Mrnka за помощь!

1 Ответ

1 голос
/ 30 августа 2011

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

Похоже, ваш сайт использует базовую HTTP-аутентификацию. Для такой аутентификации вам необходимо создать пользовательскую webHttpBinding конфигурацию:

<system.serviceModel>
  <client>
    <endpoint address="http://MyUrl/"
              binding="webHttpBinding"
              bindingConfiguration="secured"
              behaviorConfiguration="MyData"
              contract="MyNameSpace.MyIService"
              name="MyData"/>
  </client>
  <bindings>
    <webHttpBinding>
      <binding name="secured">
        <security mode="TransportCredentialOnly">
          <transport clientCredentialType="Basic" />
        </security>
      </binding>
    </webHttpBinding>
  </bindings>
  <behaviors>
    <endpointBehaviors>
      <behavior name="MyData">
        <webHttp/>
      </behavior>
    </endpointBehaviors>
  </behaviors>
</system.serviceModel>
...