![](/img/trans.png)
[英]How to get related Entities with azure mobile app Tablecontroller
[英]How can I return a BadRequest on Azure Mobile Services TableController GET template method?
我正在使用Azure移动服务 (遵循标准的Azure TodoItems教程 ),它们提供的最基本的GET
方法是:
public IQueryable<MyModel> GetAllMyInfo()
{
return Query();
}
此方法有效,但我尝试对其进行扩展,以便该方法仅返回MyModel
身份验证的用户的MyModel
数据(由针对Mobile Service API调用的X-ZUMO-AUTH
身份验证标头标准标识)。 所以我修改了以下代码:
public IQueryable<MyModel> GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
var ownerId = currentUser.Id;
return Query().Where(s => s.OwnerId == ownerId);
}
当传递有效的身份验证令牌时,这也适用。 但是 ,如果传递了无效的auth标头,则currentUser
为null
,并且查询失败(很明显)。 所以我试图检查是否为空,并返回BadRequest
或403
HTTP代码。 但是,简单的返回Return BadRequest(“ Invalid authentication”)会产生编译错误:
public IQueryable<MyModel> GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
if(currentUser == null) {
return BadRequest("Database has already been created."); // This line gives a compilation error saying I need a cast.
}
var ownerId = currentUser.Id;
return Query().Where(s => s.OwnerId == ownerId);
}
有谁知道如何检查有效的身份验证令牌并在此方法上返回403
(它需要IQueryable
返回类型?
您可以在此方法上使用[AuthorizeLevel]
属性,以指示必须存在有效令牌才能调用该方法。 如果没有,它将返回401。
因此,您的完整方法是:
[AuthorizeLevel(AuthorizationLevel.User)]
public IQueryable<MyModel> GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
var ownerId = currentUser.Id;
return Query().Where(s => s.OwnerId == ownerId);
}
请注意,对于Azure Mobile Apps SDK(不是移动服务),上述属性仅替换为[Authorize]
。
我知道这有点晚了,但是将在这里为您和其他可能遇到类似问题的人提供文档。
(虽然与Matt同意可以/应该使用[Authorize]
属性实现403,但问题是有关返回不同的HttpStatusCode或IQueryable的问题)
我有一个类似的场景,我需要验证一些查询参数并返回结果或HttpError(在我的情况下,我需要带内容的404)。
我发现了两种方法,要么将返回值保留为IQueryable<T>
并抛出HttpResponseException
,要么将返回值更改为IHttpActionResult
并使用IHttpActionResult
或Ok(Data)返回normal。
我发现更喜欢稍后,因为抛出异常会在调试时中断执行,而不会带来令人愉悦的开发经验。
//Adding Return annotation for API Documentation generation
[ResponseType(typeof(IQueryable<MyModel>))]
public IHttpActionResult GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
if(currentUser == null) {
return BadRequest("Database has already been created.");
}
var ownerId = currentUser.Id;
return Ok(Query().Where(s => s.OwnerId == ownerId));
}
public IQueryable<MyModel> GetAllMyInfo()
{
// Get the current user
var currentUser = User as ServiceUser;
if(currentUser == null) {
throw new HttpResponseException(System.Net.HttpStatusCode.BadRequest)
// Or to add a content message:
throw new HttpResponseException(new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.BadRequest) {
Content = new System.Net.Http.StringContent("Database has already been created.")
});
}
var ownerId = currentUser.Id;
return Query().Where(s => s.OwnerId == ownerId);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.