我的情况与这个问题非常相似,但由于他没有得到答案,我认为我会投入更多的意见.
一切都在本地工作正常(在VS嵌入式服务器上).当我部署到Azure时,我得到一个404错误,伴随着"找不到与控制器名称相匹配的类型......".
但是,当我加载routedebugger模块时,即使在Azure上,映射似乎也可以.
我该怎么做来调试这个问题?
谢谢,
亚历克斯
编辑:我的路线是这样创建的:
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
};
GlobalConfiguration.Configuration.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
编辑2:这是我的控制器类
public class EmployeeController : ApiController
{
// GET api/<controller>
public IEnumerable<Employee> Get()
{
using (var context = new nws())
{
return context.Employees;
}
}
// GET api/<controller>/5
public Employee Get(int id)
{
using (var context = new nws())
{
return context.Employees.FirstOrDefault(e => …Run Code Online (Sandbox Code Playgroud) I've tried following this post but I'm still not quite there:
CORS support for PUT and DELETE with ASP.NET Web API
In my web.config I have the following:
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<httpProtocol>
<customHeaders>
<!-- TODO: don't let anyone make requests - only approved clients -->
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<handlers>
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
<remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="WebDAV" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." …Run Code Online (Sandbox Code Playgroud) 我有两个项目的解决方案.一个Web Api bootstap项目,另一个是类库.
类库包含一个带属性路由的ApiController.我将web api项目中的引用添加到类库中,并希望它能够正常工作.
Web api中的路由配置为:
config.MapHttpAttributeRoutes();
Run Code Online (Sandbox Code Playgroud)
控制器很简单,看起来像:
public class AlertApiController:ApiController
{
[Route("alert")]
[HttpGet]
public HttpResponseMessage GetAlert()
{
return Request.CreateResponse<string>(HttpStatusCode.OK, "alert");
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我转到网址"/ alert"时我得到了404.
我在这里错过了什么?为什么我不能使用这个控制器?组装肯定是加载所以我不认为http://www.strathweb.com/2012/06/using-controllers-from-an-external-assembly-in-asp-net-web-api/是答案这里.
有任何想法吗?
c# asp.net-web-api attributerouting asp.net-web-api-routing asp.net-web-api2
我在使用命名空间和RoutePrefix将我的web-api应用程序拆分到不同的区域(而不是mvc区域)时遇到问题
该应用程序使用Owin Self Host托管,在我的Startup类中,我有以下内容.
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
Run Code Online (Sandbox Code Playgroud)
我测试过的两个控制器
[RoutePrefix("api/test")]
public class TestController : ApiController
{
[Route("")]
public IHttpActionResult Get()
{
return Ok("api");
}
}
Run Code Online (Sandbox Code Playgroud)
[RoutePrefix("sync/test")]
public class TestController : ApiController
{
[Route("")]
public IHttpActionResult Get()
{
return Ok("sync");
}
}
Run Code Online (Sandbox Code Playgroud)
这两个控制器存在两个不同的命名空间,Api和Sync.
当我尝试使用http:// localhost/api/test和http:// localhost/api/sync访问两个控制器时, 我得到404.
但是,如果我将其中一个控制器重命名为例如TestApiController,那么两者都有效.
如果有可能做我想做的事,有人会有个好主意吗?
我正在使用WebAPI 版本控制包通过X-Api-Header使用"VersionHeaderVersionedControllerSelector"对我的API进行版本控制.我还使用Microsoft.AspNet.WebApi.HelpPage自动生成API的文档.为了控制versionign工作,他们需要与VersionXYZ进行的命名空间命名空间中的后缀,使"VersionHeaderVersionedControllerSelector"能够将请求路由到像这样的控制器的相应版本:
namespace WEBAPI.Api.Controllers.Version1
{ public class ProductsController : ApiController {} }
namespace WEBAPI.Api.Controllers.Version2
{ public class ProductsController : ApiController {} }
Run Code Online (Sandbox Code Playgroud)
这按预期工作,但是当我看到生成的帮助页面ApiDescription被包括在ID(命名空间中的"VersionXYZ"后缀GETapi/Version1.Products)和RelativePath(API/Version1.Products)性能.理想的情况是什么,我想要做的就是有一个顶层帮助页面刚刚API的版本号和钻探将呈现API即ApiDescription.ID = GETapi /产品和ApiDescription.RelativePath = API /产品的正常方式
有没有办法使用Out of the Box API实现这一点,或者我需要推出自己的ApiExplorer实现
我正在创建一个Web Api(v2.0)方法,需要将十进制值作为参数.
如果我使用以下URL,我收到404找不到错误:
http://localhost:4627/api/Product/Eligibility/10.5
Run Code Online (Sandbox Code Playgroud)
但是如果我对Int参数使用以下URL,它会起作用:
Http://localhost:4627/api/Product/Eligibility/10
Run Code Online (Sandbox Code Playgroud)
这些是api中的两个相应方法:
// GET api/Product/Eligibility/10.0
[Route("api/Product/Eligibility/{amount:decimal}")]
public decimal GetEligibiilty(decimal amount)
{
return amount;
}
// GET api/Product/Eligibility/10
[Route("api/Product/Eligibility/{amount:int}")]
public decimal GetEligibiilty(int amount)
{
return amount;
}
Run Code Online (Sandbox Code Playgroud)
史蒂夫
我正在尝试添加API版本,我的计划是为不同命名空间中的每个版本创建一个控制器.我的项目结构如下所示(注意:每个版本没有单独的区域)
Controllers
|
|---Version0
| |
| |----- ProjectController.cs
| |----- HomeController.cs
|
|---Version1
|
|----- ProjectController.cs
|----- HomeController.cs
Run Code Online (Sandbox Code Playgroud)
我正在使用RoutingAttribute作为路由.因此,Version0中的ProjectController具有路由功能
namespace MyProject.Controllers.Version0
{
class ProjectController : BaseController
{
...
[Route(api/users/project/getProjects/{projectId})]
public async GetProjects(string projectId)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
和Version1中的ProjectController具有路由功能
namespace MyProject.Controllers.Version1
{
class ProjectController : BaseController
{
...
[Route(api/v1/users/project/getProjects/{projectId})]
public async GetProjects(string projectId)
{
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用该服务时,我得到404-NotFound.
如果我将控制器重命名为具有唯一名称(Project1Controller和Project2Controller),则路由可以正常工作.但是,我试图避免重命名以简化.
我按照此链接解决了问题,但没有帮助.我确实创造了一些领域但仍然没有成功.在global.aspx文件中添加路由逻辑没有帮助.命名空间也不起作用. http://haacked.com/archive/2010/01/12/ambiguous-controller-names.aspx/
上面的链接建议创建区域,但属性路由不支持按链接区域:http: //www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-在-Web的API-2
还有其他解决方案吗?RoutingAttributes有错误吗?
谢谢!
c# asp.net asp.net-web-api asp.net-web-api-routing asp.net-web-api2
有没有办法从Web API上下文中运行的服务方法(控制器外部)静态获取路由值?例如,我可以在ASP.NET MVC中执行以下操作:
var mvcHandler = HttpContext.Current.Handler as MvcHandler;
var routeValues = mvcHandler.RequestContext.RouteData.Values;
Run Code Online (Sandbox Code Playgroud)
我想为Web API找到此代码的等效版本.
当我尝试调试示例Web API请求并查看HttpContext.Current.Handler它是类型时HttpControllerHandler,但此类型没有任何属性来访问路由数据.
编辑
尝试帮助提供更多信息.我试图从中读取值的代码是在我为我的应用程序构建自定义对象的工厂类中.
我想通过两种方式揭露公司的api:
api.company.com(纯WebApi网站)
company.com/api(将WebApi添加到现有的MVC5公司站点)
因此,我将模型/控制器放在一个单独的程序集中,并从两个网站引用它.
另外,我使用路由属性:
[RoutePrefix("products")]
public class ProductsController : ApiController
Run Code Online (Sandbox Code Playgroud)
现在,上面的控制器可以通过以下方式访问:
api.company.com/products哪个好
company.com/products我想更改为company.com/api/products
有没有办法继续使用路由属性和设置MVC项目,所以它为所有路由添加"api"?
我已经尝试了很长一段时间让Web API 2正常工作.我已经通过互联网阅读了很多文章和帖子,但到目前为止我还不走运.
我只需要使用简单的Web API方法,但由于某种原因,我仍然没有找到404方法.我现在真的不知道,问题可能在我看来一切都好.
我尝试了很多属性,配置等等.我最终得到了这段代码:
Global.asax中
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
Run Code Online (Sandbox Code Playgroud)
WebApiConfig.cs
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(x => x.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
Run Code Online (Sandbox Code Playgroud)
ApiController
public class ContactFormController : ApiController
{
[Route("~/api/sendemail")]
[HttpPost()]
public IHttpActionResult SendEmail(ContactFormModel contactForm)
{
return Ok();
}
}
Run Code Online (Sandbox Code Playgroud)
模型:
public class ContactFormModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Subject { get; set; }
public …Run Code Online (Sandbox Code Playgroud)