【问题标题】:MVC 5: Cant send certain values in URL parametersMVC 5:无法在 URL 参数中发送某些值
【发布时间】:2017-05-31 01:59:28
【问题描述】:

我正在尝试将 asp.net mvc 5 中的 : / . 之类的字符发送到 API 控制器端点,但是一旦我尝试包含某些字符的内容,它就会失败。例如,我无法发送message:hi,我必须将其更改为message_hi 才能使其正常工作。

我正在尝试使用 Exchange 发送电子邮件,但正文(包含 URL 和其他信息)无法通过。

我的 API 控制器:

[Route("send/{adress}/{subject}/{body}")]
        public void SendEmail(string adress, string subject, string body)
        {
            Office365MailSender ms = new Office365MailSender();
            EmailDto email = new EmailDto(adress, subject, body);
            ms.Send(email);
        }

从我的应用程序调用上述端点:

public static async Task<string> SendMail(IPhoneCall phoneCall)
        {
            var email = new EmailEntity(phoneCall);

            using (var client = new HttpClient())
            {
                var uri = new Uri("http://url/email/send/" + email.Recipient + "/" + email.Title + "/" + email.body);
                var msg = await client.GetAsync(uri);
            }
            return "Email Sent";
        }

uri 变量的值示例如下: http://url/email/send/myemail@outlook.com/Hello There/Hi,\nThis is a url you can use for stuff: https://thisisit.com. \n Thanks bye.

我在发送之前尝试了HttpUtility.UrlEncode 在正文上,但这无济于事。有谁知道如何发送包含这些类型字符的字符串?

【问题讨论】:

  • 最好使用 POST 并在请求正文中发送消息。不要尝试在 url 的路径部分对此类特殊字符进行编码。你会失败:hanselman.com/blog/…
  • @DarinDimitrov 嗨,谢谢!您能否提供有关如何执行此操作的简短代码 sn-p 并将其发布为答案? :) 感谢您的链接,将通读它。

标签: c# asp.net asp.net-mvc url exchangewebservices


【解决方案1】:

我建议您使用 POST 动词来发送消息正文。所以你可以从编写一个视图模型开始:

public class MailMessageViewModel
{
    public string Address { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

您的 Web API 操作将作为参数:

[Route("send")]
[HttpPost]
public IHttpActionResult SendEmail(MyViewModel model)
{
    Office365MailSender ms = new Office365MailSender();
    EmailDto email = new EmailDto(model.Address, model.Subject, model.Body);
    ms.Send(email);
    return this.Ok();
}

然后你可以这样调用:

var email = new EmailEntity(phoneCall);

using (var client = new HttpClient())
{
    var uri = new Uri("http://url/email/send");
    var content = new StringContent(
        JsonConvert.SerializeObject(new
        {
            Address = email.Recipient,
            Subject = email.Title,
            Body = email.body,
        }),
        UnicodeEncoding.UTF8,
        "application/json");

    var msg = await client.PostAsync(uri, content);
}

【讨论】:

  • 正是我所需要的,真的很难理解如何正确使用 get/post 以及如何格式化 uri/content。非常感谢!
  • 如果我使用的是普通控制器,是否可以替换 IHttpActionResult?试图让它工作并最终得到 404 的 atm。
  • 您使用的是哪个版本的 Web API? 普通控制器是什么意思?在 Web API 中,控制器继承 ApiController,控制器操作是此控制器上必须返回 IHttpActionResult 的方法。
  • 那是我的错误,对不起。我只需要[Route("send")],即使我正在发送参数?我不需要使用[Route("send/{model}")]?
  • 不,您需要的一切都已在我的回答中显示:[Route("send")]。因为您的控制器操作将复杂对象作为参数,所以框架假定此参数只能来自请求的主体。 Route属性仅用于表示需要匹配的url的路径部分。
猜你喜欢
  • 2017-10-24
  • 2019-12-11
  • 2019-08-11
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
相关资源
最近更新 更多