我有一个用c#/ asp.net编程的网络服务。
[WebService(Namespace = "http://example.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[System.ComponentModel.ToolboxItem(false)]
public class Service: System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Result GetData()
{
User user = GetUser();
if (user.LoggedIn)
{
return GetData();
}
else
{
// raise exception -> return error 403
}
}
如何从此网络服务中返回错误403?我可以抛出异常 - 但这显示了异常,而不是他的错误。
有什么想法吗?
答案 0 :(得分:26)
您无需同时设置Context.Response.Status
和Context.Response.StatusCode
。只需设置
Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden
会自动为您设置Response.Status
。
答案 1 :(得分:22)
如果您使用的是MVC,则需要执行以下操作:
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
答案 2 :(得分:17)
完全回答这个问题 - 这是我用过的代码(感谢strider获取更多信息):
[WebService(Namespace = "http://example.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
[System.ComponentModel.ToolboxItem(false)]
public class Service: System.Web.Services.WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public Result GetData()
{
User user = GetUser();
if (user.LoggedIn)
{
return GetData();
}
else
{
Context.Response.Status = "403 Forbidden";
//the next line is untested - thanks to strider for this line
Context.Response.StatusCode = 403;
//the next line can result in a ThreadAbortException
//Context.Response.End();
Context.ApplicationInstance.CompleteRequest();
return null;
}
}
答案 3 :(得分:7)
您可以通过将代码放在WebService构造函数中来保护所有方法。这可以防止您的WebMethod被调用:
public Service(): base()
{
if (!GetUser().LoggedIn)
{
Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden;
Context.Response.End();
}
}
答案 4 :(得分:6)
在Asp.Net Web Api 2中,您可以使用:
return new StatusCodeResult(HttpStatusCode.Forbidden, this);
答案 5 :(得分:3)
Context.Response.StatusCode = 403;
答案 6 :(得分:1)
您的网络服务请求将首先遇到您的global.asax文件。你可以检查&回到那里。
答案 7 :(得分:0)
禁止403将是访问您网站上的禁止内容的结果。我想你想要的是在结果中返回一条消息“用户未登录”
答案 8 :(得分:0)
return Forbid();
创建一个ForbidResult(默认为Status403Forbidden)。