maysam_p82 Ответов: 0

Я не могу подключиться к своему веб-сервису 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, и попытался изменить этот файл, но мне это не удалось.

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)

0 Ответов