2011-04-13 18 views
26

Tengo un servicio web programado en C#/asp.net.Servicio web Asp.Net: me gustaría devolver el error 403 prohibido

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

¿Cómo es posible devolver el error 403 de este servicio web? Puedo lanzar una excepción, pero esto muestra la excepción y no su error.

¿Alguna idea?

+0

Volverá valor del servicio si el usuario es 'LoggedIn' debe devolver ese tipo 'Result' de ese método. – 1110

+0

y cómo devuelvo este tipo de 'Resultado'? – bernhardrusch

+0

Declara que su método devuelve el tipo 'Resultado'. Y debe devolver el objeto de ese tipo de su método. ¿Qué es 'Datos()'? No puedes devolver algo solo desde un bloque 'if', porque si ese bloque es falso, tu método no devolverá nada. – 1110

Respuesta

16

Para responder a la pregunta por completo - este es el código que he usado (gracias Strider para más información):

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

Esto me da una ThreadAbortException cuando se usa con WebMethod y ScriptMethod. – Eterm

+0

intente utilizar Context.ApplicationInstance.CompleteRequest() en lugar de Context.Response.End() – bernhardrusch

+1

Vale la pena mencionar que 'Response.Status =" 403 Forbidden "; 'es el' estado' completo que consiste en 'Response.StatusCode' y' Response.StatusDescription'. Podría ser mejor usar 'Response.StatusDescription' en lugar de' Response.Status' –

0

Forbidden 403 sería el resultado del acceso al contenido prohibido en su sitio web. Creo que lo que quiere aquí es devolver un mensaje como parte de tu resultado es que "El usuario no se registra en"

3
Context.Response.StatusCode = 403; 
+0

¿dónde obtengo este objeto de respuesta [puedo hacerlo? t accederlo directamente]? – bernhardrusch

+0

Desde la propiedad Contexto. –

+1

Context.Response.Status = "403 Prohibido"; Context.Response.End(); return null; – bernhardrusch

1

Sus solicitudes de servicios web se encuentran por primera vez su archivo Global.asax. Puede marcar & y regresar allí.

7

Puede proteger todos sus métodos colocando el código en su constructor de WebService. Esto evita que su WebMethod incluso de ser llamado:

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

Usted no lo hace necesita establecer Context.Response.Status y Context.Response.StatusCode. Basta con establecer

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

se establecen automáticamente Response.Status para usted.

+0

Debe ser un comentario en @bernhardrusch answer –

14

Si estaba utilizando MVC que haría lo siguiente:

  return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
5

En Asp.Net Web API 2, tendrá que utilizar:

return new StatusCodeResult(HttpStatusCode.Forbidden, this); 
+0

¡Esto no responde la pregunta en absoluto!La pregunta se refería a un WebService y este es WebApi2 –

+0

. Entiendo lo que dices, ¡pero estaba arreglando algunas cosas heredadas y no necesitaba saber la respuesta a una pregunta diferente que ya sabía! –

+0

ok my bad ... no sabía que las personas seguirían trabajando en servicios web. – arviman

Cuestiones relacionadas