标签: asp.net-web-api-routing

WebAPI 2.2上的Elmah.axd - 未找到HTTP资源

我正试图在我的broswer中访问/elmah.axd,但它返回:

{"message":"No HTTP resource was found that matches the request URI 'http://services.domain.com/elmah.axd'."}
Run Code Online (Sandbox Code Playgroud)

服务器是本地的(127.0.0.1),即使在那,我有我的web.config Elmah设置以这种方式保护它:

<elmah>
    <security allowRemoteAccess="true" />
</elmah>
Run Code Online (Sandbox Code Playgroud)

我的WebApiConfig看起来像:

public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Locally only you will be able to see the exception errors
            config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.LocalOnly;

            // Web API routes
            config.Routes.IgnoreRoute("elmah", "elmah.axd");
            config.Routes.IgnoreRoute("allemah", "elmah.axd/{*pathInfo}");
            config.Routes.IgnoreRoute("elmahgeneric", "{resource}.axd/{*everything}");
            config.MapHttpAttributeRoutes();

            var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
            jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();

            // Remove the XML formatter
            config.Formatters.Remove(config.Formatters.XmlFormatter);

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "{controller}/{id}",
                defaults: new { …
Run Code Online (Sandbox Code Playgroud)

elmah asp.net-web-api asp.net-web-api-routing asp.net-web-api2

3
推荐指数
2
解决办法
1747
查看次数

通过传递简单和复杂的参数来调用 web api

获取在控制器中找不到 http 资源或操作的错误消息。在 web api 中,我有一个 from body 和 from uri 参数。

[HttpPost]        
public IHttpActionResult processfields(
    [FromUri]string field1,
    [FromUri]string field2, 
    [FromBody] string field3, 
    [FromUri]string field4
){...}
Run Code Online (Sandbox Code Playgroud)

在客户端中,我想通过执行以下操作来调用 web api--

using (var client = new HttpClient())
{
    //set up client
    client.BaseAddress = new Uri(Baseurl);
    client.DefaultRequestHeaders.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));


     var values = new Dictionary<string, string>();
     values.Add("field1", field1);
     values.Add("field2", field2);
     values.Add("field3", field3);
     values.Add("field4", filed4);


     var jsonString = JsonConvert.SerializeObject(values);
     try
     {

         HttpResponseMessage Res = client.PostAsync("api/home/processfields", new StringContent(jsonString, Encoding.UTF8, "application/json")).Result;
         var result = Res.Content.ReadAsStringAsync();
     }
} …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net-web-api dotnet-httpclient asp.net-web-api-routing

3
推荐指数
1
解决办法
2万
查看次数

如何将所有路由传递给 Web API 中的单个控制器?

我有一个 OWIN 托管的应用程序,它可以做两件事:

  1. 提供 API 位于 mydomain.com/api/...

  2. 将所有其他请求路由到返回 HTML 页面的单个控制器

我目前有这条路线:

config.Routes.MapHttpRoute(
    name: "default",
    routeTemplate: "{controller}",
    defaults: new { controller = "Index" }
);
Run Code Online (Sandbox Code Playgroud)

而这个控制器:

public class IndexController : ApiController
{
    public HttpResponseMessage Get()
    {
        string html = File.ReadAllText(@"C:/www/.../index.html");
        HttpResponseMessage response = new HttpResponseMessage
        {
            Content = new StringContent(html),
            StatusCode = System.Net.HttpStatusCode.OK
        };
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
        return response;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我去我的家乡路线时,这很好用:

mydomain.com => HTML
Run Code Online (Sandbox Code Playgroud)

如何配置路由模板,以便始终访问同一个控制器?

mydomain.com/path1 => I want the same HTML
mydomain.com/path1/something => I want the same HTML …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api asp.net-web-api-routing

3
推荐指数
1
解决办法
1293
查看次数

核心 API 控制器捕获所有未知路由

我有一个带有一堆现有控制器的 Core 2.2 API。我现在要做的是添加一个新的控制器,它的作用类似于一个通用路由,但仅适用于该控制器(并且不会干扰现有控制器的路由)

在我现有的控制器中,我将路由定义为控制器属性

[Route("api/[controller]")]
[ApiController]
public class SandboxController : ControllerBase
{
    [HttpGet("Hello")]
    public IEnumerable<string> Hello()
    {
        return new string[] { "Hello World", TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time")).ToString()};
    }
}
Run Code Online (Sandbox Code Playgroud)

对于这个新的“catchall”控制器,我需要它能够捕获路由到它的任何 Get、Post、Put、Delete。例如,这个控制器路由是 ../ api/catchall。如果有人在哪里发帖到 ../api/catchall/ some/random/unknown/route我试图抓住这个并将其路由到 ../api/catchall/ post

到目前为止,我完全没有成功。这是我到目前为止得到的:

在我的 Startup.cs

    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseAuthentication();

...

    app.UseMvc(routes =>
    {
        routes.MapRoute("default", "{controller=Sandbox}/{action=Hello}/{id?}");

        routes.MapRoute(
            name: "catchall",
            template: "{controller}/{*.}", 
            defaults: new { controller = "catchall", action = "post" });
    });
Run Code Online (Sandbox Code Playgroud)

和 catchall 控制器:

[Route("api/[controller]")]
[ApiController]
public class …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-web-api-routing .net-core .net-core-2.2

3
推荐指数
1
解决办法
4468
查看次数

ASP.NET Core 3 添加路由前缀

Startup.cs我添加api/到我的路线模式的开始。

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "api/{controller}/{action=Index}/{id?}");
});
Run Code Online (Sandbox Code Playgroud)

但它没有做任何事情:旧的 URL 继续工作,并且以 return 404 开头的 URL 继续工作。/api这没有任何意义!

如何让我的 API 在 下提供服务/api

asp.net-web-api asp.net-web-api-routing asp.net-core

3
推荐指数
1
解决办法
2575
查看次数

.NET 6 中的 API 控制器路由不再起作用

我正在尝试在 .NET 6 中创建一个标准 WebAPI 项目。我注意到标准 ApiController 路由没有我喜欢的主要 api 路由。当我添加它时,控制器崩溃了。它不会给我一个 404(未找到),它只是给我一个索引页,上面写着我必须启用 JavaScript。我真的不知道该怎么做才能使我的应用程序正常工作,我可以将其放在api路线的开头: [Route("api/[controller]")]

我尝试以不同的组合将其添加到默认控制器路由映射中。我尝试UseEndpoints在 Program 类中添加该方法。我只是不确定 6 有什么不同。

对于那些想要“查看我的代码”的人,我只是使用带有 React 的标准 WebAPI 项目(没有 Redux!)。

asp.net-web-api-routing .net-6.0

3
推荐指数
1
解决办法
4063
查看次数

Web API - 支持的动词?

我把共同为本地代码阵营谈话,我试图了解ApiController HTTP动词的细微差别.约ApiController几件事情Beta版,RC最终版本,并建议之间显著改变你如何设置这是相互矛盾的,有时甚至是错误的.

假设我刚刚离开WebApiConfig中的标准路由:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
Run Code Online (Sandbox Code Playgroud)

(因为你真的可以把东西放在自己的头上,如果你在{}动作添加参数点击这里)

我理解约定如何适用于简单的Crud调用:

    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }


    // GET api/values/5
    public string Get(int id)
    {
        return "value";
    }

    // POST api/values
    public void Post([FromBody]string value)
    {
    }
Run Code Online (Sandbox Code Playgroud)

或者你可以改变这些,只要它们以动词名称开头:

    // GET api/values/5
    public string GetMyStuff(int id)
    {
        return "value";
    }
Run Code Online (Sandbox Code Playgroud)

但是,最初的规范说ApiController支持Get,Put,Post和Delete.然而,我可以添加方法:

    public void HeadOfTheClass()
    {
    }
Run Code Online (Sandbox Code Playgroud)

哪个适用于Head动词,但我无法为隐藏或不存在的动词添加方法:

    public void MKCOL()
    {
    }
    public void Bubba()
    { …
Run Code Online (Sandbox Code Playgroud)

asp.net-web-api asp.net-web-api-routing

2
推荐指数
1
解决办法
2821
查看次数

WebApi 2使用属性路由构建嵌套路由.导致同时映射到两个控制器

我有两个名为"Products"的控制器和另一个名为"ProductsGroup"的控制器

[RoutePrefix("api/{clientUrl}/products")]
public class ProductsController : BaseApiController
{
    /// <summary>
    /// Get all products from a client
    /// </summary>
    /// <returns></returns>
    [Route("")]
    public HttpResponseMessage Get()
    {
        var model = Repository.GetProducts(ClientId).Select(p => ModelFactory.Create<ProductsModel>(p));
        return Request.CreateResponse(HttpStatusCode.OK, model);
    }
}

[RoutePrefix("api/{clientUrl}/products/groups")]
public class ProductGroupsController : BaseApiController
{
    /// <summary>
    /// Get all productgroups
    /// </summary>
    /// <returns></returns>
    [Route("")]
    public HttpResponseMessage Get()
    {
        var model = Repository.GetProductGroups(ClientId);
        return Request.CreateResponse(HttpStatusCode.OK, model);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我像这样路由时,由于"找到了与URL匹配的多个控制器类型",我无法访问ProductGroupsController

是否可以使路由忽略url的"products"部分并仅映射到productgroupscontroller?

c# asp.net-web-api asp.net-web-api-routing

2
推荐指数
1
解决办法
1168
查看次数

获取方法无法在web api中工作

嗨,我正在开发web api2和angularjs中的一个应用程序.从angularjs访问URL时我遇到了一些路由问题.

我试图访问下面的网址.

var url = '/api/projects/4/processes';
Run Code Online (Sandbox Code Playgroud)

我的控制器代码如下所示.

[RoutePrefix("api/processes")]
public class processesController : ApiController
{      
    [ActionName("projects/{projectsId}/processes")]
    public HttpResponseMessage Get(int id)
    {
        return Request.CreateResponse(HttpStatusCode.OK, "");
    }
}
Run Code Online (Sandbox Code Playgroud)

我收到404错误.我无法点击网址.

这是我的webapi.config文件.

config.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    //routeTemplate: "{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激.

c# asp.net-web-api asp.net-web-api-routing

2
推荐指数
1
解决办法
4564
查看次数

WebAPI控制器GetAll或获取一些ID

我有这样的控制器

[Route("api/Foo/MyController/{id}")]
public IHttpActionResult Get(int id)
{
   //Code code
   foo(id); // Foo accept Int or Null
}
Run Code Online (Sandbox Code Playgroud)

这样做,如果调用api/Foo/MyController/1,但我需要调用api/Foo/MyController,就像它"GetAll"一样,参数id现在为null,并且控制器中的东西全部返回,怎么去?

c# asp.net-web-api asp.net-web-api-routing asp.net-web-api2

2
推荐指数
2
解决办法
4582
查看次数