webentwicklung-frage-antwort-db.com.de

Asp.Net-Webdienst: Ich möchte den Fehler 403 unzulässig zurückgeben

Ich habe einen Webservice in c #/asp.net programmiert.

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

Wie ist es möglich, den Fehler 403 aus diesem Webservice zurückzugeben? Ich kann eine Ausnahme auslösen - aber dies zeigt die Ausnahme und nicht seinen Fehler.

Irgendwelche Ideen?

28
bernhardrusch

Um die Frage vollständig zu beantworten - dies ist der Code, den ich verwendet habe (danke Strider für weitere Informationen):

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

Sie müssen nicht sowohl Context.Response.Status als auch Context.Response.StatusCode einstellen. Einfach einstellen

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

setzt automatisch Response.Status für Sie.

26

Wenn Sie MVC verwenden, führen Sie folgende Schritte aus:

            return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
21
Bryan Legend

Sie können alle Ihre Methoden schützen, indem Sie den Code in Ihren WebService-Konstruktor einfügen. Dies verhindert, dass Ihre WebMethode überhaupt aufgerufen wird:

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

In Asp.Net Web Api 2 würden Sie Folgendes verwenden:

return new StatusCodeResult(HttpStatusCode.Forbidden, this);
6
arviman
Context.Response.StatusCode = 403;
3
Mark Cidade

Ihre Webdienstanfragen treffen zuerst auf Ihre global.asax-Datei. Sie können dort überprüfen und zurückkehren.

1
Chuck Savage

Das Verbot 403 ist das Ergebnis des Zugriffs auf verbotene Inhalte auf Ihrer Website. Ich denke, Sie möchten hier eine Nachricht als Teil Ihres Ergebnisses zurückgeben, das heißt "Benutzer ist nicht angemeldet".

0
Orin