Home > Net >  Why method isn't allowed?
Why method isn't allowed?

Time:12-16

I prepared a razor component for my contact form. The SubmitForm method looks like:

private async Task<string> SubmitForm()
{
    var json = Newtonsoft.Json.JsonConvert.SerializeObject(ContactFormModel);
    var stringContent = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
    var response = await Http.PostAsync("/Contact/SendMessage", stringContent);        
    Logger.LogInformation("Executed PostAsync.");
    Debug.Write("Executed PostAsync");

    if (response.IsSuccessStatusCode)
    {
        var resultContent = response.Content.ReadAsStringAsync().Result;
        return resultContent;
    }
    else
        return "failed";
}

In line 5 it should send a post request to "/Contact/SendMessage".

The ContactController looks like:

    namespace MannsBlog.Controllers.Web
{
    [Route("[controller]")]
    public class ContactController : Controller
    {
        private readonly IMailService _mailService;
        private readonly ILogger<ContactController> _logger;
        private readonly GoogleCaptchaService _captcha;
        public ContactController(IMailService mailService,
            ILogger<ContactController> logger,
            GoogleCaptchaService captcha)
        {
            _mailService = mailService;
            _logger = logger;
            _captcha = captcha;
        }

        [HttpGet("")]
        public IActionResult Index()
        {
            return View();
        }

        [HttpPost]
        public IActionResult SendMessage([FromBody] ContactFormModel form)
        {
            try
            {
                if (ModelState.IsValid)
                {
                    var spamState = VerifyNoSpam(form);
                    if (!spamState.Success)
                    {
                        _logger.LogError("Spamstate wasn't succeeded");
                        return BadRequest(new { Reason = spamState.Reason });
                    }

                    if (!_captcha.Verify(form.Recaptcha))
                    {
                        throw new Exception("The submission failed the spam bot verification.");
                    }
                    else
                    {
                        _mailService.SendMail("ContactTemplate.txt", form.Name, form.Email, form.Subject, form.Message);
                    }
                    return Json(new { success = true, message = "Your message was successfully sent." });
                }
                _logger.LogError("Modelstate wasnt valid");
                return Json(new { success = false, message = "ModelState wasnt valid..." });
            }
            catch (Exception ex)
            {
                _logger.LogError("Failed to send email from contact page", ex.Message);
                return Json(new { success = false, message = ex.Message });
            }
        }        
    }
}

But if i'm execute it, i get in response the RequestMessage "

RequestMessage {Method: POST, RequestUri: 'https://saschamanns.de/Contact/SendMessage', Version: 1.1, Content: System.Net.Http.StringContent, Headers: { Request-Context: appId=cid-v1:64d2a34b-4aea-4d0b-8163-a49082988533 Request-Id: |fec381c24e685e4b8eddd2b24064a1e4.a6d3a3ff85fe5c44. traceparent: 00-fec381c24e685e4b8eddd2b24064a1e4-a6d3a3ff85fe5c44-00
Content-Type: application/json; charset=utf-8 Content-Length: 572 }} System.Net.Http.HttpRequestMessage"

and as ReasonPhrase "Method not allowed".

But why? How can i fix this?

CodePudding user response:

Your URL is flawed. Two options:

  1. Use Http.PostAsync("/Contact", stringContent); //no /SendMessage

or

  1. In the controller, use [HttpPost("SendMessage")]

and, some unrelated suggestions from codereview :

  • don't use .Result:
//var resultContent = response.Content.ReadAsStringAsync().Result;
  var resultContent = await response.Content.ReadAsStringAsync();
  • consider System.Text.Json instead of Newtonsoft.

  • when you use Http.PostAsJsonAsync(...) you resolve both issues in one go.

  • Related