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

时间:2011-04-13 13:13:51

标签: c# asp.net web-services http-status-code-403

我有一个用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?我可以抛出异常 - 但这显示了异常,而不是他的错误。

有什么想法吗?

9 个答案:

答案 0 :(得分:26)

您无需同时设置Context.Response.StatusContext.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)。

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase.forbid?view=aspnetcore-3.1