找不到与 ASP.NET Web API 中的请求 URI 匹配的 HTTP 资源

2024-03-10

这是我的 TransferController 类的草图。

所有这些都是 Web API 代码。

public class TransferController : ApiController
{
  [HttpGet, ActionName("Queue")]
  public IEnumerable<object> GetQueue(Guid sessionId) {...}

  [HttpDelete, ActionName("Delete")]
  public void Delete(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("Cancel")]
  public bool Cancel(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("UploadedBytes")]
  public long GetUploadedByteCount(Guid sessionId, Guid fileId) {...}

  [HttpGet, ActionName("DownloadUrl")]
  public string GetDownloadUrl(string fileId) {...}

  [HttpPost, ActionName("FileChunk")] 
  public void PostFileChunk([FromUri]Guid sessionId, [FromUri]Guid fileId) {...}

  [HttpPost, ActionName("UploadDefinition")]
  public Guid PostUploadItem([FromBody]UploadDefinition uploadDef) {...}

}

这就是路由。

public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{action}"
    );
  config.Routes.MapHttpRoute(
    name: "DefaultApiDefaultMethod", 
    routeTemplate: "api/{controller}"
    );
}

这就是调用。

$.ajax({
  url: "api/Transfer/Queue",
  data: { sessiondId: login.SessionId() }    
})
.done(function (result) {
  history.push(new UploadItem());
  for (var i = 0; i < result.length; i++) {
    var ui = new UploadItem(result[i]);
    history.push(ui);
  }
})
.fail(function (result) {
  app.showMessage(JSON.parse(result.responseText).Message);
});

这就是结果。

No HTTP resource was found that matches the request URI 'http://localhost:54770/api/Transfer/Queue?sessiondId=0e2c47b9-e674-446d-a06c-ce16932f9580'.

这是我的 UserController 类的草图。

public class UserController : ApiController 

  [HttpGet, ActionName("Authenticate")]
  public object Authenticate(string email, string password) {...}

  [HttpPost]
  public void Register([FromBody]UserDefinition userDef) {...}

  [HttpGet, ActionName("Pulse")]
  public bool Pulse(Guid sessionId) {...}

}

由于我无法理解的原因,我可以毫无困难地调用 UserController 中的任何内容。参数以完全相同的方式编组,并且same路线正在使用中。


下面的 Darrel Miller 使用单元测试来验证路由。坦白说,我后悔自己没有考虑到这一点,现在我也做了同样的事情。

但他所展示的测试实际上只测试 URL 的解析。例如,这个测试通过

public void TestMvc4RouteWibble()
{
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
      );


  var route =
      config.Routes.GetRouteData(new HttpRequestMessage()
      {
        RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581")  //?
      });

  Assert.IsNotNull(route);
  Assert.AreEqual("Transfer", route.Values["controller"]);
  Assert.AreEqual("Wibble", route.Values["action"]);

}

尽管传输控制器上明显缺少 Wibble 方法。

此外,路由对象实际上不是 HttpRoute 对象,而是 HttpRouteData 对象。但这已经被简单地纠正了。 HttpRoute 对象可用作 HttpRouteData 对象的属性。

public void TestMvc4RouteWibble()
{
  var config = new HttpConfiguration();
  config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
      );


  var routeData =
      config.Routes.GetRouteData(new HttpRequestMessage()
      {
        RequestUri = new Uri("http://localhost:54770/api/Transfer/Wibble?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580&fileId=0e2c47b9-e674-446d-a06c-ce16932f9581")  //?
      });

  Assert.IsNotNull(routeData);
  Assert.AreEqual("Transfer", routeData.Values["controller"]);
  Assert.AreEqual("Wibble", routeData.Values["action"]);

}

它又具有 Handler 属性。然而,这比它可能提供的信息要少,因为空处理程序仅仅意味着(来自 MSDN)

如果为 null,则默认处理程序将消息分派到 IHttpController 的实现。

现在,我的控制器派生自 ApiController,它当然实现了 ExecuteAsync 方法,这是 IHttpController 接口指定的唯一方法。我想这意味着如果我了解更多的话我可以测试该方法的执行。


这是一个测试,证明路由工作正常,

[Fact]
public void TestRoute() 
{
    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}"
        );


    var route =
        config.Routes.GetRouteData(new HttpRequestMessage()
        {
            RequestUri = new Uri("http://localhost:54770/api/Transfer/Queue?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580")  //?
        });

    Assert.NotNull(route);
    Assert.Equal("Transfer",route.Values["controller"]);
    Assert.Equal("Queue",route.Values["action"]);

}

这是一个测试,显示调度/操作选择也有效,

[Fact]
public void TestDispatch()
{
    var config = new HttpConfiguration();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}"
        );

    var server = new HttpServer(config);

    var client = new HttpClient(server);
    var response =
        client.GetAsync(new Uri("http://localhost:54770/api/Transfer/Queue?sessionId=0e2c47b9-e674-446d-a06c-ce16932f9580")) // 
            .Result;

    Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}


public class TransferController : ApiController
{
   [HttpGet]
   [ActionName("Queue")]
   public IEnumerable<object> Queue(Guid sessionId) 
   {
       return null;
   }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找不到与 ASP.NET Web API 中的请求 URI 匹配的 HTTP 资源 的相关文章

随机推荐

  • VB.NET:哪个 As 子句与带有 Option Strict On 的匿名类型一起使用?

    考虑始终声明的要求Option Strict On 我们总是需要用As关键词 匿名类型的类型是什么 例子 Dim product As New With Key Name paperclips Price 1 29 接下来会发生什么As 尝
  • 使用 .NET Framework 或 Windows API 检测 Windows 11

    在 NET Framework 中 获取可以使用的操作系统版本Environment OSVersion与Major and Minor告诉您 Windows 版本的值 即 6 1 Windows 7 10 0 Windows 10 尽管
  • 在不创建主题的情况下更改 emacs 中特定文本的颜色

    是否可以选择您正在编辑的一段文本并更改其颜色 我知道可以创建一个颜色主题来为某些类型的文本着色 例如某种编程语言中的着色函数 但是是否可以对特定 emacs 中的选定文本片段进行一次性颜色更改不创建主题的文档 提前致谢 在任何情况下 主题都
  • 无法访问对象原型上的方法

    我可以创建一个Cat对象并在其原型上设置一个方法来打印猫的名字 var log function message var results result results append p message p function Cat name
  • 从 OnActionExecuting 重定向到外部 url?

    我需要从 OnActionExecuting 方法重定向到外部网址 比方说 www google com 现在我正在使用这样的东西 public override void OnActionExecuting ActionExecuting
  • 如何使用变换原点让 svg 元素从中心旋转? [复制]

    这个问题在这里已经有答案了 我正在尝试对 svg 矩形元素进行非常简单的旋转 我希望这个元素相对于它的中心旋转 我试图使用transform origin属性来实现这一点 参见代码片段 尽管尝试使用 center 或 50 从中心旋转 但它
  • 使用 sql 查询在 hibernate 中创建新的对象实例

    我正在尝试使用查询在 hibernate 中创建一个对象 然后该对象将被保存回表示该类的表中 hbm xml 文件摘录
  • Django simple_tag 和设置上下文变量

    我正在尝试使用 simple tag 并设置上下文变量 我使用的是 django 的 trunk 版本 from django import template register simple tag takes context True d
  • strstr 不工作

    如果我输入 test 为什么这段特定的代码在 strstr 上返回 false char input 100 int main fgets input 100 stdin printf s input if strstr test mess
  • Perl 中有正则表达式来查找文件扩展名吗?

    Perl 中有正则表达式来查找文件扩展名吗 例如 如果我有 test exe 我怎样才能得到 exe my file test exe Match a dot followed by any number of non dots until
  • Ubuntu 上的 JAVA_HOME 定义不正确?

    我正在尝试在 Ubuntu 14 04 中安装一些软件 Shibboleth 我已经安装了 Java 7 OpenJDK usr lib jvm 我有这些行 usr environment JAVA HOME usr lib jvm jav
  • SQLite,将数据集/数据表复制到数据库文件

    我已经用创建的表填充了数据集another数据库文件 该表不在我希望能够将表复制到的数据库文件中 现在我想将所有这些记录 DataTable 保存到新创建的 SQLite 数据库文件中 我怎样才能做到这一点 另外 如果可能的话 我真的想避免
  • Microsoft.Extensions.Logging 对比自然对数

    我看到很多帖子提到将 Microsoft Extensions Logging 与 NLog 一起使用 我想更好地了解 Microsoft Extensions Logging 的用途是什么 具体来说为什么需要它或者与 NLog 一起使用它
  • Mongoose 具有 true 的独特布尔值

    我知道如何将字符串设置为在我的架构上唯一 如下所示 string type String unique true 但是有没有一种方法可以在对象上拥有具有 true 值的唯一布尔值并使用 false 默认设置 我需要的是 如果我尝试保存一个具
  • 以编程方式发送短信,无需短信编辑器窗口

    直到昨天 我还认为不使用 IOS 短信接口就不可能发送后台短信 这里很多人也保证 然而 今天我下载了一个名为 SmartSender 的新应用程序 它可以安排您的短信 然后自动发送 我测试了它 短信实际上并不是在后台发送的 而是出现一个本地
  • 尝试创建一个具有 6 个放射线的圆形菜单

    我正在尝试使用 html 和 css 创建一个带有 6 个径向线的圆形菜单 我只得到 6 个径向线 边界 中的 5 个 我需要获得第 5 项和第 6 项之间的最后一个径向 我需要得到相同的图片 DEMO http jsfiddle net
  • 我可以使 C++11 类/对象普遍线程安全吗?

    读过 据我了解 我可以确保我的类是线程安全的对于所有线程实现 通过使用 C 11 互斥体 我的理解正确吗 我期待的是要么是 可能有警告 要么不是 有原因 我的代码可能需要在目标平台上重新编译 但不需要更改我的源代码 彼得 换句话说 我应该能
  • 如何在 Win32 C++ 程序在后台运行时检测按键

    我有一个程序 每当我最小化它时 它就会进入系统托盘 我想知道的是 a 当我的程序位于系统托盘中时 如何检测按键操作 b 我怎么知道他们在键盘上按下了什么 特别是功能按钮 您需要使用设置键盘挂钩设置WindowsHookEx http msd
  • 在 R 中使用 ggplot2 创建多项目时间线

    我正在尝试创建一个多项目时间表 其中包含项目的各个阶段 以便将我们当前所有的项目组织在一个易于可视化的地方 我最初发现timeline 打包并能够半创建我所希望的东西 然而 该包似乎不太可定制 所以我希望在ggplot2 反而 这是我的假数
  • 找不到与 ASP.NET Web API 中的请求 URI 匹配的 HTTP 资源

    这是我的 TransferController 类的草图 所有这些都是 Web API 代码 public class TransferController ApiController HttpGet ActionName Queue pu