Почему это ASP.NET Веб-обработчик не получил запрос на публикацию?

#javascript #c# #asp.net #ajax #post

Вопрос:

Я смотрел на ASP.NET пример приложения, написанного кем — то другим, который в основном состоит из HTML-файла, отправляющего запрос AJAX POST веб-обработчику, который затем должен обработать запрос и отправить обратно сообщение о том, что он был успешно получен.

Однако этот пример кода, похоже, возвращает «состояние 500 (внутренняя ошибка сервера)», и я действительно не могу понять, почему. Не будет ли кто-нибудь любезен просмотреть код и рассказать мне, почему это происходит? Я был бы вам очень признателен.

Я хотел проанализировать код, чтобы использовать его в проекте поисковой системы, который должен отправлять строку ввода пользователя из интерфейсной html-формы веб-обработчику, затем эта строка будет обработана и отправлена искателю, который будет сканировать сайты из базы данных и возвращать сайты с наибольшим объемом ключевого слова.

Вот HTML — файл с запросом на публикацию AJAX:

 <!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
   <title>Search Engine</title>
</head>
<body>
   <table>
       <tr>
           <td><label id="From" />From : </td>
           <td><input id="TxtFrom"></td>
       </tr>
       <tr>
           <td><label id="To" />To : </td>
           <td><input id="TxtTo" required="required"></td>
       </tr>
       <tr>
           <td><label id="To" />Body : </td>
           <td>
               <textarea id="TxtBody" required="required"
                         rows="10" cols="30"></textarea>
           </td>
       </tr>
       <tr>
           <td />
           <td style="align-content:flex-end">
               <button onclick="loadJsonData();">Send Data to the Server</button>
           </td>
       </tr>
   </table>
   <script>
       function loadJsonData() {
           var postdata = JSON.stringify(
               {
                   "From": document.getElementById("TxtFrom").value,
                   "To": document.getElementById("TxtTo").value,
                   "Body": document.getElementById("TxtBody").value
               });
           try {
               $.ajax({
                   type: "POST",
                   url: "MailHandler.ashx",
                   cache: false,
                   data: postdata,
                   dataType: "json",
                   success: getSuccess,
                   error: getFail
               });
           } catch (e) {
               alert(e);
           }
           function getSuccess(data, textStatus, jqXHR) {
               alert(data.Response);
           };
           function getFail(jqXHR, textStatus, errorThrown) {
               alert(jqXHR.status);
           };
       };
   </script>
</body>
</html>
 

Вот веб-обработчик (MailHandler.ashx):

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Web;
using System.Web.UI;

namespace CodeProject
{
    public class MailHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            string jsonString = String.Empty;
            HttpContext.Current.Request.InputStream.Position = 0;
            using (System.IO.StreamReader inputStream = new System.IO.StreamReader(HttpContext.Current.Request.InputStream))
            {
                jsonString = inputStream.ReadToEnd();
                System.Web.Script.Serialization.JavaScriptSerializer jSerialize = new System.Web.Script.Serialization.JavaScriptSerializer();
                var email = jSerialize.Deserialize<Mail>(jsonString);

                if (email != null)
                {
                    string froma = email.From;
                    string to = email.To;
                    string body = email.Body;

                    context.Response.Write(jSerialize.Serialize(
                         new
                         {
                             Response = "Message Has been sent succesfully"
                         }));
                }
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}
 

Веб-конфигурация:

 <configuration>
  <system.web>
    <customErrors mode="Off"/>
    <compilation debug="true" targetFramework="4.5">
      <assemblies />
    </compilation>
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <system.webServer>
    <httpErrors errorMode="Detailed" />
    <handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
  </system.webServer>
</configuration>
 

Комментарии:

1. взгляните на ответ на запрос в инструментах разработчика браузера, если ASP.NET настроен на это, он отправит очень подробную ошибку в теле ответа

2. Вы должны выяснить подробности ошибки 500. Трудно кому-либо помочь, если мы не знаем, что именно терпит неудачу.

3. В настоящее время это то, что он возвращает в консоль: «Не удалось загрузить ресурс: сервер ответил со статусом 500 (Внутренняя ошибка сервера)». Я осмотрюсь и попытаюсь получить более подробный ответ.

4. Вы пытались установить точку останова в обработчике ProcessRequest? У вас есть совпадение по точке останова? Или, если вы не можете отладить этот код, добавьте ведение журнала, чтобы узнать, достигает ли запрос сервера.

5. Просто добавил точку останова, где вы сказали, что, похоже, она не попадает. Это означает, что он не доходит до сервера.