为啥不允许方法?

Posted

技术标签:

【中文标题】为啥不允许方法?【英文标题】:Why method isn't allowed?为什么不允许方法? 【发布时间】:2022-01-19 01:42:13 【问题描述】:

我为我的联系表单准备了一个剃须刀组件。 SubmitForm 方法如下所示:

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";

在第 5 行,它应该向“/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 );
            
                
    

但如果我执行它,我会收到 RequestMessage "

RequestMessage 方法:POST,RequestUri: 'https://saschamanns.de/Contact/SendMessage',版本:1.1,内容: System.Net.Http.StringContent,标头:请求上下文: appId=cid-v1:64d2a34b-4aea-4d0b-8163-a49082988533 请求 ID: |fec381c24e685e4b8eddd2b24064a1e4.a6d3a3ff85fe5c44。追踪父: 00-fec381c24e685e4b8eddd2b24064a1e4-a6d3a3ff85fe5c44-00 内容类型:应用程序/json; charset=utf-8 内容长度:572 System.Net.Http.HttpRequestMessage"

并且作为 ReasonPhrase “方法不允许”。

但是为什么呢?我该如何解决这个问题?

【问题讨论】:

【参考方案1】:

您的网址有缺陷。两种选择:

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

    在控制器中,使用[HttpPost("SendMessage")]

还有来自 codereview 的一些不相关的建议:

不要使用.Result:
//var resultContent = response.Content.ReadAsStringAsync().Result;
  var resultContent = await response.Content.ReadAsStringAsync();

考虑 System.Text.Json 而不是 Newtonsoft。

当您使用Http.PostAsJsonAsync(...) 时,您可以一次性解决这两个问题。

【讨论】:

以上是关于为啥不允许方法?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF 中不允许方法重载?

为啥 C# 不允许静态方法实现接口?

为啥我得到一个“不允许的方法”

为啥在 Laravel 中保存数据时出现方法不允许错误?

为啥Java不允许我通过同一个类的方法访问私有方法?

为啥允许使用泛型 lambda 而不允许使用带有模板化方法的嵌套结构?