Tengo un servicio web programado 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
        }
    }

¿Cómo es posible devolver el error 403 de este servicio web? Me puede tirar una excepción – pero esto muestra la excepcion y no la de su error.

Alguna idea?

  • Que el valor de retorno de servicio sólo si el usuario es ‘LoggedIn’ debe devolver ese «Resultado» tipo de método.
  • y ¿cómo puedo devolver este «Resultado» tipo ?
  • Usted declara su método para volver a «Resultado» de tipo. Y debe devolver un objeto de ese tipo de su método. ¿Qué es el ‘Data()’? Usted no puede devolver algo de uno solo ‘si’ bloque, porque si ese bloque es falso que su método no devuelve nada.
  • He pensado que puede elevar a un exceptino o algo por el estilo y, a continuación, el servicio web volvería 403
  • Código 401 sería más apropiado ya que el usuario podría acceder a los recursos si él loggs en

8 Comentarios

  1. 27

    Usted no necesita ajustar tanto Context.Response.Status y Context.Response.StatusCode. Simplemente ajuste

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

    se establece automáticamente Response.Status para usted.

    • Debe ser un comentario en @bernhardrusch respuesta
  2. 23

    Si estuviera usando MVC te gustaría hacer lo siguiente:

                return new HttpStatusCodeResult(HttpStatusCode.Forbidden);
  3. 17

    Contestar a la pregunta – este es el código que he usado (gracias strider para obtener 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;
            }
        }
    • Esto me da una ThreadAbortException cuando se utiliza con WebMethod y ScriptMethod.
    • trate de usar el Contexto.ApplicationInstance.CompleteRequest() en lugar de Contexto.Respuesta.End()
    • Vale la pena mencionar que Response.Status = "403 Forbidden"; es la completa status que consta de Response.StatusCode y Response.StatusDescription. Sería mejor utilizar Response.StatusDescription en lugar de Response.Status
  4. 7

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

    public Service(): base()
    {
        if (!GetUser().LoggedIn)
        {
            Context.Response.StatusCode = (int)System.Net.HttpStatusCode.Forbidden;
            Context.Response.End();
        }
    }
    • No necesariamente correcta….Yo apalancamiento WebMethods a través de las llamadas AJAX y tengo que trabajar para autenticar al usuario(s) a través de cifrado de cookies
  5. 6

    En Asp.Net Web Api 2, usaría:

    return new StatusCodeResult(HttpStatusCode.Forbidden, this);
    • Esto no responde a la pregunta! La pregunta era referente a un WebService y este es WebApi2
    • Entiendo lo que estás diciendo, pero me estaba arreglando algún legado a las cosas, y no necesita saber la respuesta a una pregunta que yo ya lo sabía!
    • ok mi mal ..no se dio cuenta de que la gente todavía estaría trabajando en servicios web.
    • NP. Ojalá no!
    • como su perfil comentario! 😉 Parece legado mierda código es común en el campo de la automoción 😛
  6. 3
    Context.Response.StatusCode = 403;
    • donde puedo conseguir este objeto de respuesta [no puedo acceder a ella directamente]?
    • Desde el Contexto de la propiedad.
    • Contexto.Respuesta.Status = «403 Forbidden»; Contexto.Respuesta.End(); return null;
    • Contexto.Respuesta.El estado es una cadena de propiedad, +1 para @bernhardrusch. Correcto de la propiedad para establecer sería Contexto.Respuesta.StatusCode si solo desea establecer 403, int.
  7. 1

    Sus solicitudes de servicio web será el primer encuentro de su mundial.archivo asax. Usted puede comprobar & volver allí.

  8. 0

    Prohibido 403 sería una consecuencia del acceso a los contenidos prohibidos en su sitio web. Creo que lo que quiere aquí es devolver un mensaje como parte de su Resultado que es «Usuario no ha iniciado sesión»

Dejar respuesta

Please enter your comment!
Please enter your name here