41 votes

Service Web Asp.Net : Je souhaite retourner l'erreur 403 interdite

J'ai un service web programmé en 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
        }
    }

Comment est-il possible de retourner l'erreur 403 hors de ce service web ? Je peux faire une exception - mais cela montre l'exception et non son erreur.

Des idées ?

35voto

Lone Coder Points 2417

Si vous utilisiez MVC, vous feriez ce qui suit :

            return new HttpStatusCodeResult(HttpStatusCode.Forbidden);

32voto

Michael Chatfield Points 421

Vous n'avez pas besoin de définir à la fois Context.Response.Status et Context.Response.StatusCode. Réglage simple de

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

définira automatiquement Response.Status pour vous.

23voto

bernhardrusch Points 4445

Pour répondre complètement à la question - c'est le code que j'ai utilisé (merci strider pour plus d'informations) :

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

7voto

Andy Joiner Points 747

Vous pouvez protéger toutes vos méthodes en plaçant le code dans votre constructeur WebService. Cela empêche même votre WebMethod d'être appelé :

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

6voto

arviman Points 1663

Dans Asp.Net Web Api 2, vous utiliseriez :

return new StatusCodeResult(HttpStatusCode.Forbidden, this);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X