C# WinApp throws (403) Запрещенное исключение при отправке HTTP/GET-запроса
У меня есть сайт ASP.NET. Когда я вызываю URL " http://example.org/worktodo.ashx" из браузера, он работает нормально.
Я создал одно приложение для Android, и если я позвоню по указанному выше URL-адресу из приложения для Android, то это также работает нормально.
Я создал приложение Windows в C#, и если я вызываю вышеуказанный URL из этого приложения Windows, то происходит сбой с ошибкой 403 запрещено.
Ниже приведен код C#.
try
{
bool TEST_LOCAL = false;
//
// One way to call the url
//
WebClient client = new WebClient();
string url = TEST_LOCAL ? "http://localhost:1805/webfolder/worktodo.ashx" : "http://example.org/worktodo.ashx";
string status = client.DownloadString(url);
MessageBox.Show(status, "WebClient Response");
//
// Another way to call the url
//
WebRequest request = WebRequest.Create(url);
request.Method = "GET";
request.Headers.Add("Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
request.Headers.Add("Connection:keep-alive");
request.Headers.Add("User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36");
request.Headers.Add("Upgrade-Insecure-Requests:1");
request.Headers.Add("Accept-Encoding:gzip, deflate, sdch");
request.ContentType = "text/json";
WebResponse response = request.GetResponse();
string responseString = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
MessageBox.Show(responseString, "WebRequest Response");
}
catch (WebException ex)
{
string error = ex.Status.ToString();
}
Исключение:
The remote server returned an error: (403) Forbidden.
StatusCode value is 'Forbidden'
StatusDescription value is 'ModSecurity Action'
Ниже приведен код приложения для Android (используется библиотека org.apache.http):
Handler handler = new Handler() {
Context ctx = context; // save context for use inside handleMessage()
@SuppressWarnings("deprecation")
public void handleMessage(Message message) {
switch (message.what) {
case HttpConnection.DID_START: {
break;
}
case HttpConnection.DID_SUCCEED: {
String response = (String) message.obj;
JSONObject jobjdata = null;
try {
JSONObject jobj = new JSONObject(response);
jobjdata = jobj.getJSONObject("data");
String status = URLDecoder.decode(jobjdata.getString("status"));
Toast.makeText(ctx, status, Toast.LENGTH_LONG).show();
} catch (Exception e1) {
Toast.makeText(ctx, "Unexpected error encountered", Toast.LENGTH_LONG).show();
// e1.printStackTrace();
}
}
}
}
};
final ArrayList<NameValuePair> params1 = new ArrayList<NameValuePair>();
if (RUN_LOCALLY)
new HttpConnection(handler).post(LOCAL_URL, params1);
else
new HttpConnection(handler).post(WEB_URL, params1);
}
Усилия / Исследования, выполненные до сих пор, чтобы решить проблему:
Я нашел следующие решения, которые исправили ошибку 403 для них, но не смогли решить мою проблему
- Кто-то сказал, что для файла должны быть установлены соответствующие права доступа 'rwx', поэтому я установил права доступа 'rwx' для файла
- Кто-то сказал, указав, что ПОЛЬЗОВАТЕЛЬ-АГЕНТ работал, я попробовал (см. Еще один способ позвонить)
- Кто-то сказал, действительный заголовок исправил это - использовал Fiddler, чтобы найти действительный заголовок, который нужно установить, я использовал Chrome / Developer Tools и установил действительный заголовок (см. Другой способ вызова)
- Кто-то настроил ModSecurity, чтобы исправить это, но у меня не установлен ModSecurity для моего веб-сайта, поэтому для меня это не вариант
- У многих были проблемы с MVC и их исправили, но я не использую MVC, поэтому эти решения не для меня
- Справочное руководство ModSecurity гласит: чтобы удалить его с сайта, добавьте
<modules><remove name="ModSecurityIIS" /></modules>
на web.config. Я сделал, но не смог решить проблему
Мои вопросы:
- Почему C# WinApp терпит неудачу, когда приложение для Android успешно?
- Почему Android-приложение не встречает исключение "ModSecurity Action"?
- Почему в C# WinApp возникает исключение "ModSecurity Action"?
- Как исправить код C#?
Пожалуйста, помогите мне решить проблему. Спасибо вам всем.
1 ответ
Я нашел ответ. Ниже приведен код, который работает как ожидалось.
bool TEST_LOCAL = false;
string url = TEST_LOCAL ? "http://localhost:1805/webfolder/worktodo.ashx" : "http://example.org/worktodo.ashx";
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36";
request.ContentType = "text/json";
WebResponse response = request.GetResponse();
string responseString = new System.IO.StreamReader(response.GetResponseStream()).ReadToEnd();
MessageBox.Show(responseString, "WebRequest Response");
ПРИМЕЧАНИЕ: требуется using System.Net;