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

ber*_*sch 30 c# asp.net web-services http-status-code-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
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

小智 28

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

Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden
Run Code Online (Sandbox Code Playgroud)

将自动Response.Status为您设置.


Bry*_*end 24

如果您使用MVC,则执行以下操作:

            return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
Run Code Online (Sandbox Code Playgroud)


ber*_*sch 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是`Response.Status ="403 Forbidden"; `是完整的`status`,由`Response.StatusCode`和`Response.StatusDescription`组成.使用`Response.StatusDescription`而不是`Response.Status`可能更好 (2认同)

And*_*ner 7

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

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


arv*_*man 6

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

return new StatusCodeResult(HttpStatusCode.Forbidden, this);
Run Code Online (Sandbox Code Playgroud)