Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Url.Link在WebAPI中不起作用_C#_Asp.net Mvc 4_Asp.net Web Api_Url Helper - Fatal编程技术网

C# Url.Link在WebAPI中不起作用

C# Url.Link在WebAPI中不起作用,c#,asp.net-mvc-4,asp.net-web-api,url-helper,C#,Asp.net Mvc 4,Asp.net Web Api,Url Helper,使用下面的单元测试。。我正在尝试测试我的webapi [Test] public void CheckControllerForCreate() { var config = new HttpConfiguration(); config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; var request = new HttpRequestMessage(HttpMethod.Post, "htt

使用下面的单元测试。。我正在尝试测试我的webapi

[Test]
public void CheckControllerForCreate()
{
    var config = new HttpConfiguration();
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product");
    var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}");
    var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "products" } });
    var controller = new ProductController
    {
        ControllerContext = new HttpControllerContext(config, routeData, request),
        Request = request,
        Url = new UrlHelper(request)
    };

    controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;

    var result = controller.Create(new Product {Id = 4, Name = "Tomato Soup", Category = "Groceries", Price = 1});
}

[HttpPost]
public HttpResponseMessage Create(Product product)
{
    var url = Url;
    if (product == null)
        throw new HttpResponseException(new HttpResponseMessage{StatusCode = HttpStatusCode.BadRequest,ReasonPhrase = "Product is not specified"});
    products.Add(product);
    var response = Request.CreateResponse(HttpStatusCode.Created, product);
    string uri = Url.Link("Foo", product.Id);
    response.Headers.Location = new Uri(uri);
    return response;
}
创建操作引发异常,因为
uri
null
。现在,Url帮助器正确地拾取RouteName,否则将出现RouteName not found异常。我假设我的配置有问题

我提到了一些关于控制器单元测试的文章和其他文章

WebAPI方法位于codeplex上

编辑

我已将其缩小到(UrlHelper)中的vpd为空


似乎不明白为什么

您需要将RoutedData设置到请求中,方法与配置相同:

controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;
此外,您还错误地使用了
Url.Link
帮助程序。您尚未指定控制器,也未指示id

控制器中的代码应如下所示:

string uri = Url.Link("Foo", new { id = product.Id, controller = "product" });

更新:

这里有一个完整的例子

控制器:

public class ProductController : ApiController
{
    public HttpResponseMessage Create(int id)
    {
        var uri = Url.Link("Foo", new { id = id, controller = "product" });
        return Request.CreateResponse(HttpStatusCode.OK, uri);
    }
}
测试:


好的,让我给你写一个完整的测试。请参阅我的更新答案,了解完整的工作示例。我认为我的路线配置错误。。我的目的是能够将一个产品传递给我的控制器…现在你传递的是一个整数,路由也是相同的..我需要修复路由中的某些内容吗?不,你不需要修复任何内容。把整数换成乘积就行了。。我在错误的测试中附加routeData..因此我的错误:)…而且,uri仍然是在没有指定控制器的情况下构造的。。我检查了两种情况。那么控制器是做什么的?
public class ProductController : ApiController
{
    public HttpResponseMessage Create(int id)
    {
        var uri = Url.Link("Foo", new { id = id, controller = "product" });
        return Request.CreateResponse(HttpStatusCode.OK, uri);
    }
}
// arrange
var config = new HttpConfiguration();
config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost/api/product");
var route = config.Routes.MapHttpRoute("Foo", "api/{controller}/{id}");
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary(new { controller = "product" }));
var controller = new ProductController
{
    ControllerContext = new HttpControllerContext(config, routeData, request),
    Request = request,
    Url = new UrlHelper(request)
};
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config;
controller.Request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData;

// act
var result = controller.Create(4);

// assert
...