Привет,
Мне нужно подключить мое приложение 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.
Обратите внимание, это пример, адрес, а "Сайт говорит" это что-то еще.
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 за помощь!