Asp.Net Web服务:我想返回错误403禁止

我有一个在c#/ asp.net中编程的Web服务。

[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 } } 

如何从此Web服务返回错误403? 我可以抛出exception – 但这显示了exception,而不是他的错误。

有任何想法吗?

您不需要同时设置Context.Response.StatusContext.Response.StatusCode 。 简单的设定

 Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden 

将自动为您设置Response.Status

如果您使用的是MVC,则需要执行以下操作:

  return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 

完全回答这个问题 – 这是我用过的代码(感谢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; } } 

您可以通过将代码放在WebService构造函数中来保护所有方法。 这可以防止您的WebMethod被调用:

 public Service(): base() { if (!GetUser().LoggedIn) { Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden; Context.Response.End(); } } 

在Asp.Net Web Api 2中,您将使用:

 return new StatusCodeResult(HttpStatusCode.Forbidden, this); 
 Context.Response.StatusCode = 403; 

您的Web服务请求将首先遇到您的global.asax文件。 你可以检查并返回那里。

禁止403将是访问您网站上的禁止内容的结果。 我想你想要的是在结果中返回一条消息“用户未登录”