C# 在控制器终结点内生成资源URL

C# 在控制器终结点内生成资源URL,c#,.net-core,asp.net-core-webapi,C#,.net Core,Asp.net Core Webapi,我想通过用资源URL替换关于子资源的信息来最小化API响应主体。因此,假设您将获取一个供应商,不想列出他正在销售的所有产品,但您希望提供一个指向这些信息的URL 例如,我在控制器端点中尝试了这一点 string resourceUrl = Url.Link(nameof(GetVendorById), new { id = 1 }); 并希望得到以下字符串 https://localhost:5001/vendors/1 不幸的是,字符串返回null。那么如何生成这样的资源URL呢 下面的伪

我想通过用资源URL替换关于子资源的信息来最小化API响应主体。因此,假设您将获取一个供应商,不想列出他正在销售的所有产品,但您希望提供一个指向这些信息的URL

例如,我在控制器端点中尝试了这一点

string resourceUrl = Url.Link(nameof(GetVendorById), new { id = 1 });
并希望得到以下字符串

https://localhost:5001/vendors/1
不幸的是,字符串返回
null
。那么如何生成这样的资源URL呢

下面的伪代码只是我想要实现的一个示例,我知道在获取供应商时不应该返回供应商产品

[HttpGet("{id:int}")]
public async Task<ActionResult<VendorResponseModel>> GetVendorById([FromRoute] int id)
{
    VendorResponseModel vendor = new VendorResponseModel()
    {
        Id = id,
        Name = "Vendor " + id,
        Products = new List<VendorProductResponseModel>()
        {
            new VendorProductResponseModel()
            {
                Id = 1,
                ResourceUrl = Url.Link(nameof(ProductsController.GetProductById), new { id = 1 })
            }
        }
    };

    return Ok(vendor);
}
[HttpGet(“{id:int}”)]
公共异步任务GetVendorById([FromRoute]int id)
{
VendorResponseModel vendor=新的VendorResponseModel()
{
Id=Id,
Name=“供应商”+id,
产品=新列表()
{
新的VendorProductResponseModel()
{
Id=1,
ResourceUrl=Url.Link(nameof(ProductsController.GetProductById),新的{id=1})
}
}
};
返回Ok(供应商);
}
将为您提供包含您想要的所有参数的URL。
编辑

如果您认为问题出在包本身,请清除解决方案,删除所有包并
dotnet restore

Url。当使用
名称
属性标记资源方法时,Link
对我来说确实有效。因此,当调用
Url.Link(nameof(GetVendorById),new{id=1})时
我必须确保
GetVendorById
方法的命名如下

[HttpGet("{id:int}", Name = "GetVendorById")]
public async Task<ActionResult<VendorResponseModel>> GetVendorById([FromRoute] int id)
{
    // ...
}
[HttpGet(“{id:int}”,Name=“GetVendorById”)]
公共异步任务GetVendorById([FromRoute]int id)
{
// ...
}

您是否试图链接到同一控制器中的操作?有时不会,如我添加的代码示例所示:)谢谢您的回复。我调试了这些方法,这就是结果,所以我认为问题是另一个。这是一个全新的项目,控制器继承自
ControllerBase
,感谢您的编辑。我找到了解决办法,并回答了自己的问题。但也许您知道如何避免命名方法,因为这似乎是多余的。
[HttpGet("{id:int}", Name = "GetVendorById")]
public async Task<ActionResult<VendorResponseModel>> GetVendorById([FromRoute] int id)
{
    // ...
}