Я не могу подключиться к своему веб-сервису SOAP через xamarin android через порт 10.0.2.2
Привет, я изучал в интернете эту проблему в течение нескольких дней, но я не знаю, почему я не могу подключиться к своему веб-сервису SOAP. Я видел, что у многих других была эта проблема, но многие из них могли ее решить. Каждый раз, когда я сталкиваюсь с этой ошибкой в моем Android-приложении:
System.Net.WebException: The request failed with HTTP status 400: BadRequest at System.Web.Services.Protocols.SoapHttpClientProtocol.ReceiveResponse
Что я уже пробовал:
Url-адрес::
http://10.0.2.2:51036/Areas/Admin/WebServices/SyncWebService.asmx
strRawJson = syncWebService.GetListInfo_GeneralCategory();
Веб-сервис SOAP входит в проект MVC.
ZurdoDev
Я бы предложил использовать что-то вроде PostMan для проверки вызова. Вы, вероятно, пропустили заголовок или что-то в этом роде.
maysam_p82
Но я протестировал его с другим приложением MVC (очевидно, с локальным хостом:http://localhost:51036/Areas/Admin/WebServices/SyncWebService.asmx)
это работает довольно хорошо.
ZurdoDev
Да, но вы же проверяли .Net и теперь хотят, чтобы Android работал. Это означает, что .Net добавляет что-то под капотом, о чем вы не знаете. Вот почему почтальон-это хороший вариант, потому что тогда вы должны установить все.
maysam_p82
Это правда, но я не уверен, что почтальон может использовать конкретный IP-адрес Android 10.0.2.2. В любом случае, я собираюсь попробовать прямо сейчас.
Richard Deeming
Запрос, который вы отправляете, не соответствует формату, который служба ожидает получить.
Мы не можем видеть код для вашего сервиса, и мы не можем видеть код, который его вызывает, поэтому мы не можем сказать вам, почему и как это исправить.
Вам нужно будет отладить код и изучить запрос, который отправляется, чтобы попытаться выяснить, в чем проблема.
maysam_p82
это URL-адрес из мобильного приложения: http://10.0.2.2:51036/Areas/Admin/WebServices/SyncWebService.asmx
string strRawJson = строка.Пустой;
string strJsonString = строка.Пустой;
DataTable dtValues = новый DataTable
{
TableName = "dtGeneralCategory"
};
пробовать
{
syncWebService.URL-адрес = "http://10.0.2.2:51036/Areas/Admin/WebServices/SyncWebService.asmx";
strRawJson = syncWebService.GetListInfo_GeneralCategory();
}
поймать (исключение бывший)
{
предупреждение ВАР = новый Android.Приложение.AlertDialog.Строитель(это);
alert.SetMessage("خطا در برقراری ارتباط با سرور! ");
alert.SetPositiveButton("بستن", delegate { return; });
тревога.Создать().Показать();
возвращать false;
}
var response = JsonConvert.DeserializeObject(strRawJson);
strJsonString = ответ.Метод toString();
dtValues = (DataTable)JsonConvert.DeserializeObject(ответ.ToString(), (typeof(DataTable)));
maysam_p82
Это код, который я использовал в мыле:
[WebMethod]
публичная строка GetListInfo_GeneralCategory()
{
string strFolderPath = "\\Areas\\Admin\\UploadedFiles\\GeneralCategories\\";
List<generalcategory> lstGeneralCategory = новый список<generalcategory>();
lstGeneralCategory = mapSyncWebService.GetListInfo_GeneralCategory();
если (!строка.IsNullOrEmpty(mapSyncWebService.errMessage))
{
возвращенная строка.Пустой;
}
if (lstGeneralCategory.Количество == 0)
возвращенная строка.Пустой;
если (каталог.существует(сервер.MapPath(strFolderPath)))
{
string[] arrFilePaths = каталог.Заражен(strFolderPath);
for (int i = 0; i < lstGeneralCategory.Граф; i++)
{
foreach (var strFileName в arrFilePaths)
{
if (strFileName.Раскол('_')[0] == "imgGeneralCategory" && strFileName.Раскол('_')[1] == lstGeneralCategory.ElementAt(я).ImageFilePath.Split('_')[1])
lstGeneralCategory.ElementAt(я).ImageBytes = Файл.ReadAllBytes(Сервер.MapPath(strFolderPath + "\\" + strFileName)).Метод toString();
}
}
}
возврат JsonConvert.SerializeObject(lstGeneralCategory);
}
maysam_p82
Но проблема в том, что я сталкиваюсь с "ошибкой 400 bad request" в мобильном приложении, прежде чем войти в сервис, и я думаю, что эмулятор вообще не может видеть 10.0.2.2. Потому что когда я ставлю IP в эмулятор браузера chrome, я сталкиваюсь с этой ошибкой.:(.
Richard Deeming
Ошибка 400 означает, что ваш запрос достиг сервера, но сервер не понял его.
maysam_p82
да, но есть ли другой способ понять проблему? И расскажет ли нам почтальон о той же проблеме?
maysam_p82
Я думаю, что почтальон должен видеть мой сервис с точки зрения эмулятора Android. А нам это тоже говорит?
Richard Deeming
Почтальон позволит вам сгенерировать и отправить запрос в службу. Он не покажет вам запрос, который ваше приложение отправляет в службу.
Вы можете попробовать использовать Неудачная Трассировка Запросов[^] для отслеживания неудачных запросов к службе. Похоже, что вы запускаете службу в IIS Express, поэтому FRT должен быть включен по умолчанию и войти в систему. %USERPROFILE%\Documents\IISExpress\TraceLogFiles
.
Ваш [WebMethod]
похоже, он звонит в другую веб-службу. Если это так, вам нужно будет выяснить, вызвана ли ошибка связью между вашим приложением и вашим сервисом или между вашим сервисом и другим сервисом.
maysam_p82
как узнать причину, по которой сервисное приложение отклоняет запрос с ip 10.0.2.2?:(
Richard Deeming
Попробуйте использовать Postman с другого компьютера в вашей сети, используя 10.0.2.2
адрес.
Если это работает, используя localhost
но если вы не используете IP-адрес, то либо Брандмауэр Windows не разрешает подключение, либо IP-адрес неверен.
Если он работает с другого компьютера в вашей сети, то убедитесь, что ваше Android-устройство / эмулятор подключено к вашей локальной сети.
maysam_p82
Нет, я уже отключил брандмауэр. Но я думаю, что проблема в том, что IIS отказывается от всех запросов на 127.0.0.1 (так как это жизненно важно для android и является еще одним значением 10.0.2.2)
как его включить ? Я использовал некоторые методы, такие как applicationhost.config, и попытался изменить этот файл, но мне это не удалось.
Richard Deeming
Это будет связано с тем, что <binding>
для сайта:
службы IIS 7 - неправильный запрос - неверное имя сервера служб IIS 7 - переполнение стека [^]
maysam_p82
Прямо сейчас я проверил URL-адрес под IP:127.0.0.1, и он возвращается:
<title>плохой запрос
Неверный Запрос - Недопустимое Имя Хоста
Ошибка HTTP 400. Имя хоста запроса недопустимо.
maysam_p82
Теперь привязка выглядит так :
<binding protocol="http" bindinginformation="*:80:*">
но он все еще не работает с 127.0.0.1:51036
maysam_p82
Нет, мой веб-сервис не вызывает другой. Я проверил url-адрес с помощью Postmane, и он отлично работает. С помощью(localhost)