MVC 6 - Web API 2.0参数URL中的空白字符

4

我想在我的Web API URL上进行搜索,如下:

http://localhost:8000/api/trips/World Trip/stops

在这种情况下,“World Trip”是一个词。但是当调用到达服务器时,它会以以下方式到达:

enter image description here

"World%20Trip" 是用 %20 来替换空格的代码!
是否有必要进行某些设置来防止使用代码替换空格?我记得在以前的版本中有 <httpRuntime relaxedUrlToFileSystemMapping="true" />
我不想在服务器内部使用任何转换方法:比如 HttpServerUtility.UrlEncode()
我的数据注释路由:
[Route("api/trips/{tripName}/stops")]

我的 StopController.cs

using AutoMapper;
using Microsoft.AspNet.Mvc;
using Microsoft.Framework.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using TheWorld.Models;
using TheWorld.ViewModels;

namespace TheWorld.Controllers.Api
{
    [Route("api/trips/{tripName}/stops")]

    public class StopController : Controller
    {
        private ILogger<StopController> _logger;
        private IWorldRepository _repository;

        public StopController(IWorldRepository repository, ILogger<StopController> logger)
        {
            _repository = repository;
            _logger = logger;
        }

        [HttpGet("")]
        public JsonResult Get(string tripName)
        {
            try
            {
                var results = _repository.GetTripByName(tripName);

                if (results == null)
                {
                    return Json(null);
                }

                return Json(Mapper.Map<IEnumerable<StopViewModel>>(results.Stops.OrderBy(s => s.Order)));
            }
            catch (Exception ex)
            {
                _logger.LogError($"Failed to get stops for trip {tripName}", ex);
                Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return Json("Error occurred finding trip name");
            }
        }
    }
}

应该默认处理这个问题,就像在asp.net mvc 4.6中一样。我建议在Github上记录这个问题的日志。 - Gabriel Sadaka
这里。让我给你提供一个问题报告的链接:https://github.com/aspnet/mvc/issues - Maxime Rouiller
你注意到你的 URL 空间已经有了吗?最好分享你的代码。 - Pankaj Gupta
3个回答

1
你可以使用 HttpUtility.UrlDecode(yourstring),这样你的应用程序就会更加安全。

1
我曾在跟随Pluralsight教程“使用ASP.net 5、MVC 6、EF7和AngularJS构建Web应用程序”时遇到了同样的问题。我通过使用以下代码解决了这个问题:
tripName = WebUtility.UrlDecode(tripName);

这似乎是beta-8版本中的一个bug。升级到rc1版本,您的问题应该会得到解决。


1
我同意user1919597的建议,升级所有软件包并安装最新的ASP版本到rc1-update1(截至11/30这个帖子发布日期为止,这是最新版本)。请参考Shawn's Blog Post执行所有需要的更新。
之后,您可以测试代码是否通过URL传递tripName并将其传递到错误消息中,如下所示。
return Json($"Error occurred finding trip name {tripName}");

如果代码返回错误,它将从url中传递tripName字符串,例如:http://localhost:5151/api/trips/World%20Trip/stops 将返回“查找旅行名称World Trip时出错”。如果您只收到错误消息而不是数据,则可能发生了其他事情......这恰好是我目前在这门课程的这部分所面临的问题......已经搜索了2天,没有真正的解决方案......总之 - 首先根据Shawn的博客更新所有内容,然后再次测试。祝你好运,我很想知道结果如何。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接