我的应用程序设置为必须使用Web API中的授权属性"授权"除登录之外的所有请求.例如
[Authorize]
[HttpGet, Route("api/account/profile")]
public ApplicationUser Profile()
{
return userModel;
}
Run Code Online (Sandbox Code Playgroud)
并且只有登录需要不授权,因为那里你得到令牌;)
[AllowAnonymous]
[HttpPost, Route("api/account/login")]
public async Task<IHttpActionResult> Login(LoginViewModel model)
{
....
}
Run Code Online (Sandbox Code Playgroud)
而不是必须将[Authorize]属性添加到我的所有路由,有没有办法全局设置它?
如何在所有网络接口上进行Web API自主绑定?
我目前有以下代码.不幸的是,它仅绑定在localhost上.因此,从localhost以外的地方访问此服务器失败.
var baseAddress = string.Format("http://localhost:9000/");
using (WebApp.Start<Startup> (baseAddress))
{
Console.WriteLine("Server started");
Thread.Sleep(1000000);
}
Run Code Online (Sandbox Code Playgroud) 在ASP.NET MVC WebAPI项目中,我们默认创建了以下控制器
public class ValuesController : ApiController
{
// 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)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
Run Code Online (Sandbox Code Playgroud)
但是可以在这里添加任何自定义方法,以便它们也可以支持get/post吗?
谢谢!
我正在寻找Web Api 2,Owin和Autofac,并需要一些指导.
概述
我有一个Owin自托管的Web Api,它使用Autofac进行IoC和依赖注入.该项目是一个控制台应用程序,就像一个服务,这意味着它可以停止和启动.我有一个带有两个构造函数的身份验证控制器:一个参数少,另一个注入存储库.
问题
当我运行服务并调用api时,我的无参数构造函数被调用,我的存储库永远不会被注入(_repository = null).
研究
我做了一些研究,并在Github上发现了一些有用的项目,我将其复制到了发球台,但我错过了很大一部分难题.这很有帮助,但没有解决我的问题.我在Stack Overflow上阅读了这个问题,Dane Sparza有一个很好的演示项目,但我找不到一个明确的解决方案.问题不是自托管而是依赖注入.
我的代码(细化了解释)
public class Startup
{
public void Configuration(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
var json = config.Formatters.JsonFormatter;
json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
config.Formatters.Remove(config.Formatters.XmlFormatter);
var connectioninfo = ConnectionInfo.FromAppConfig("mongodb");
var builder = new ContainerBuilder(); // Create the container builder.
builder.RegisterApiControllers(Assembly.GetExecutingAssembly()); // Register the Web API controllers.
builder.Register(c => …Run Code Online (Sandbox Code Playgroud) 我见过的大多数Web API 2.0方法都返回IHttpActionResult,它被定义为"定义异步创建System.Net.Http.HttpResponseMessage的命令"的接口.
我对有关方法返回时发生的事情感到有些困惑async Task<IHttpActionResult>.
你为什么要用另一个呢?或者这些功能是否相同 - 是不是IHttpActionResult已经异步?
我创建了一个web api 2,我正在尝试对它进行跨域请求,但是我收到以下错误:
选项http://www.example.com/api/save 405(方法不允许)
我已经浏览了一下这个问题的大多数解决方案是说我需要从NuGet安装COR并启用它所以我已经安装了包并标记了我的控制器
[EnableCors("*", "*", "*")]
Run Code Online (Sandbox Code Playgroud)
但这仍然没有解决问题.
我ApiController只有以下Save方法:
[ResponseType(typeof(int))]
public IHttpActionResult Save(Student student)
{
if (ModelState.IsValid)
{
using (StudentHelper helper = new StudentHelper())
{
return Ok(helper.SaveStudent(student));
}
}
else
{
return BadRequest(ModelState);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我来自不同领域的js:
$.ajax({
type: "POST",
crossDomain: true,
data: JSON.stringify(student),
crossDomain: true,
url: 'http://www.example.com/api/save',
contentType: "application/json",
success: function (result) {
console.log(result);
}
});
Run Code Online (Sandbox Code Playgroud)
我还需要做些什么来实现这个目标吗?
我有一个基本的Web API 2设置与一些基本的路由.
以下是插入的默认路径和帖子.当我调用帖子时,记录在数据库中完美创建,但"CreatedAtRoute"调用返回500错误,说明:
ExceptionMessage:"UrlHelper.Link不能返回null." ExceptionType:"System.InvalidOperationException"
为什么我会收到此错误?
[RoutePrefix("api/casenotes")]
public class CasenoteController : ApiController...
// POST api/Casenote
[Route("")]
[ResponseType(typeof(client_admission_casenote))]
public async Task<IHttpActionResult> Postclient_admission_casenote (client_admission_casenote client_admission_casenote)
{
Request.GetRequestContext().IncludeErrorDetail = true;
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.client_admission_casenote.Add(client_admission_casenote);
await db.SaveChangesAsync();
return CreatedAtRoute("DefaultApi", new { id = client_admission_casenote.casenote_id }, client_admission_casenote);
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有以下签名的控制器:
[Route("products/filter/{apc=apc}/{xpc=xpc}/{sku=sku}")]
public IHttpActionResult Get(string apc, string xpc, int? sku)
{ ... }
Run Code Online (Sandbox Code Playgroud)
我用以下URI调用此方法:
第一个URI没有问题.第二个有一个奇怪的副作用.即使apc和xpc的默认值在未提供时应为null,但参数实际上是它们的名称.我可以通过添加额外的逻辑来克服这个问题:
apc = (apc == "apc") ? null : apc;
xpc = (xpc == "xpc") ? null : xpc;
Run Code Online (Sandbox Code Playgroud)
这似乎是一个黑客攻击,如果传递的值等于参数名称,则会出现问题.
有没有办法定义路线没有这种副作用?
在我的WebAPI项目中,我Owin.Security.OAuth用来添加JWT身份验证.GrantResourceOwnerCredentials我的OAuthProvider 内部使用以下行设置错误:
context.SetError("invalid_grant", "Account locked.");
Run Code Online (Sandbox Code Playgroud)
这将返回给客户:
{
"error": "invalid_grant",
"error_description": "Account locked."
}
Run Code Online (Sandbox Code Playgroud)
在用户获得身份验证并且他尝试向我的某个控制器执行"正常"请求后,当模型无效时,他会得到以下响应(使用FluentValidation):
{
"message": "The request is invalid.",
"modelState": {
"client.Email": [
"Email is not valid."
],
"client.Password": [
"Password is required."
]
}
}
Run Code Online (Sandbox Code Playgroud)
这两个请求都在返回400 Bad Request,但有时您必须查找error_description字段,有时候还要查找message
我能够创建自定义响应消息,但这仅适用于我返回的结果.
我的问题是:是否有可能取代message与error响应由返回ModelValidatorProviders,并在其他地方?
我读过ExceptionFilterAttribute但我不知道这是不是一个好的起点.FluentValidation应该不是问题,因为它只是添加错误ModelState.
编辑:
我正在尝试解决的下一件事是WebApi中返回的数据中的命名约定不一致 - 当OAuthProvider我们返回错误error_details时,但是当我们返回BadRequest时ModelState(从ApiController)返回错误modelState.正如你可以看到第一次使用snake_case …
我有一个相当简单的C#WebAPI2项目,它在本地运行,但在远程机器(Windows Server 2012 R2 Standard)上发布到IIS后,网页显示以下内容(将customErrors设置为"Off"后):
'/'应用程序中的服务器错误.编译错误说明:在编译服务此请求所需的资源期间发生错误.请查看以下特定错误详细信息并相应地修改源代码.编译器错误消息:编译器失败,错误代码为-2146232576.
如果我抓取详细的编译器输出并在IIS服务器上运行它,我会收到一条智能屏幕错误消息:
此应用无法在您的PC上运行.要查找适用于您的PC的版本,请咨询软件发行商.
我猜它与编译器版本有关,但自上次发布以来没有任何变化.
有任何想法吗?
asp.net-web-api2 ×10
c# ×9
asp.net-mvc ×2
owin ×2
.net ×1
asp.net ×1
asynchronous ×1
autofac ×1
cors ×1
iis-8 ×1
self-hosting ×1