我正试图在我的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
获取在控制器中找不到 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
我有一个 OWIN 托管的应用程序,它可以做两件事:
提供 API 位于 mydomain.com/api/...
将所有其他请求路由到返回 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) 我有一个带有一堆现有控制器的 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) 在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?
我正在尝试在 .NET 6 中创建一个标准 WebAPI 项目。我注意到标准 ApiController 路由没有我喜欢的主要 api 路由。当我添加它时,控制器崩溃了。它不会给我一个 404(未找到),它只是给我一个索引页,上面写着我必须启用 JavaScript。我真的不知道该怎么做才能使我的应用程序正常工作,我可以将其放在api路线的开头:
[Route("api/[controller]")]
我尝试以不同的组合将其添加到默认控制器路由映射中。我尝试UseEndpoints在 Program 类中添加该方法。我只是不确定 6 有什么不同。
对于那些想要“查看我的代码”的人,我只是使用带有 React 的标准 WebAPI 项目(没有 Redux!)。
我把共同为本地代码阵营谈话,我试图了解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) 我有两个名为"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?
嗨,我正在开发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)
任何帮助,将不胜感激.
我有这样的控制器
[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,并且控制器中的东西全部返回,怎么去?