gpt4 book ai didi

asp.net-web-api - 找不到与 ASP.NET Web API 中的请求 URI 错误匹配的 HTTP 资源

转载 作者:行者123 更新时间:2023-12-01 09:10:02 28 4
gpt4 key购买 nike

这是我的 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);
});

这就是结果。

找不到与请求 URI“http://localhost:54770/api/Transfer/Queue?sessiondId=0e2c47b9-e674-446d-a06c-ce16932f9580”相匹配的 HTTP 资源。

这是我的 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 中的任何内容。参数以完全相同的方式编码,并且使用了相同的路由。


下面的 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"]);

}

尽管明显缺少 Transfer Controller 上的 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)

If null, the default handler dispatches messages to implementations of IHttpController.

现在,我的 Controller 派生自 ApiController,它当然实现了 ExecuteAsync 方法,这是 IHttpController 接口(interface)指定的唯一方法。我想这意味着如果我对它有更多了解,我可以测试该方法的执行情况。

最佳答案

这是一个演示路由工作正常的测试,

[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"]);

}

这是一个显示调度/ 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;
}

}

关于asp.net-web-api - 找不到与 ASP.NET Web API 中的请求 URI 错误匹配的 HTTP 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23013509/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com