40

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

有任何想法吗?

4

10 回答 10

34

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

            return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
于 2015-05-01T17:48:15.560 回答
32

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

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

会自动Response.Status为你设置。

于 2012-07-11T17:49:11.380 回答
18

要完全回答这个问题 - 这是我使用的代码(感谢 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;
        }
    }
于 2012-02-24T06:48:55.517 回答
7

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

public Service(): base()
{
    if (!GetUser().LoggedIn)
    {
        Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden;
        Context.Response.End();
    }
}
于 2011-10-05T09:43:38.793 回答
6

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

return new StatusCodeResult(HttpStatusCode.Forbidden, this);
于 2016-06-03T11:34:33.063 回答
3
Context.Response.StatusCode = 403;
于 2011-04-13T13:57:44.427 回答
1

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

于 2011-04-13T20:39:42.880 回答
1

aspnet core 你可以返回forbidResult。这是一个 IResult。

return new ForbidResult();
于 2021-12-21T11:55:30.913 回答
0

禁止 403 将是访问您网站上禁止内容的结果。我认为您在这里想要的是返回一条消息作为“用户未登录”的结果的一部分

于 2011-04-13T13:56:30.157 回答
0

return Forbid();创建一个 ForbidResult(默认为 Status403Forbidden)。

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

于 2020-03-02T23:00:53.590 回答