【问题标题】:WebApiContrib Jsonp and Attribute RoutingWebApiContrib Jsonp 和属性路由
【发布时间】:2013-11-12 16:45:27
【问题描述】:

根据WebApiContrib.Formatting.Jsonp GitHub readme,似乎应该在 RouteConfig.cs 中输入:

routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}/{format}",
defaults: new { id = RouteParameter.Optional, format = RouteParameter.Optional }
);

我的 AppStart 中目前没有 RouteConfig.cs 文件。我使用 Web API 2 模板创建了它,我认为我没有在结构上进行任何更改。我确实有一个 WebApiConfig.cs 我已经设置:

public static void Register (HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
}

如何包含它以使所有路由都能够返回 Jsonp?

【问题讨论】:

    标签: jsonp attributerouting web-api-contrib asp.net-web-api2


    【解决方案1】:

    您可以创建一个实现IHttpRouteInfoProvider 的自定义路由属性(向路由表添加路由时Web API 路由构建器会查找该属性),然后通过附加{format} 来修改正在生成的模板

    例子:

    [RoutePrefix("api/values")]
    public class ValuesController : ApiController
    {
        [CustomRoute(Order = 1)]
        public IEnumerable<string> GetAll()
        {
            return new string[] { "value1", "value2" };
        }
    
        [CustomRoute("{id}")]
        public string GetSingle(int id)
        {
            return "value";
        }
    }
    
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
    public sealed class CustomRouteAttribute : Attribute, IHttpRouteInfoProvider
    {
        public CustomRouteAttribute()
        {
            Template = String.Empty;
        }
    
        public CustomRouteAttribute(string template)
        {
            if (template == null)
            {
                throw new ArgumentNullException("template");
            }
    
            if (template == string.Empty)
            {
                Template = template + "{format?}";
            }
            else
            {
                Template = template.TrimEnd('/') + "/{format?}";
            }
        }
    
        public string Name { get; set; }
    
        public int Order { get; set; }
    
        public string Template { get; private set; }
    }
    

    【讨论】:

    • 现在看这个。你能再解释一下吗?除了请求 jsonp 之外,jQuery 客户端还做其他事情吗?不确定 {format} 部分在哪里发挥作用。
    • 我不知道 JsonP 的实际工作原理 :-)...可能 webapicontrib 是找到更多相关信息的地方...我只是想展示如何启用修改模板.. .
    • 我建议就了解 jsonp 和 webapicontrib 实现提出不同的问题。
    • 我之前曾在该项目的 Github 网站的问题部分 (github.com/WebApiContrib/WebApiContrib.Formatting.Jsonp/issues/…) 发布过这个问题,只是在这里尝试,除非其他人遇到它。
    【解决方案2】:

    我在pull request 中找到了这条评论,但我不明白这是否已经实现到生产包中,也没有被拉取。

    如果您正在使用属性路由,如果您打算使用 jsonp 的 URI 映射,则应在每个路由后添加“/{format}”,例如[Route("api/value/{id:int}/{format?}")]。如果您需要Content-Type 标头来指定text/javascript,那么您可以不理会您的路线。 (有关示例,请参阅示例应用程序。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2016-12-17
      • 2014-08-27
      • 2013-11-28
      • 1970-01-01
      • 2021-09-04
      相关资源
      最近更新 更多