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?
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;
}
}
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.
Wenn Sie MVC verwenden, führen Sie folgende Schritte aus:
return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
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();
}
}
In Asp.Net Web Api 2 würden Sie Folgendes verwenden:
return new StatusCodeResult(HttpStatusCode.Forbidden, this);
Context.Response.StatusCode = 403;
Ihre Webdienstanfragen treffen zuerst auf Ihre global.asax-Datei. Sie können dort überprüfen und zurückkehren.
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".