Tengo una ApiController nombre Service. Tengo un método denominado UpdatePrice en ella. Ahora quiero enviar un web http de petición de otro proyecto por recibo 404 código de error. Y si me quedo en el navegador veo esto:

<Error>
    <Message>No HTTP resource was found that matches the request URI 'http://localhost:26769/api/service/updateprice?priceId=16&cost=1234&lastUpdate=2014-10-15 11:41:54.000'.</Message>
    <MessageDetail>No type was found that matches the controller named 'service'.</MessageDetail>
</Error>

Este es el ApiController:

public class Service : ApiController
{
    PriceApplication priceApp = new PriceApplication();
    public int UpdatePrice(int priceId,int cost,DateTime lastUpdate)
    {
        try
        {
            var price = priceApp.GetByPriceId(priceId);
            price.Cost = Convert.ToDecimal(cost);
            price.LastUpdate = lastUpdate;
            priceApp.Update(price);
            return cost;
        }
        catch
        {
            return -1;
        }
    }
}

Esta es la hoja de ruta para que:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { controller = "service",action="updateprice", id = RouteParameter.Optional}
);

Y esta es la petición:

string serviceUrl = string.Format("http://localhost:26769/api/service/updateprice?priceId={0}&cost={1}&lastUpdate={2}", priceId, cost, DateTime.Now);
WebRequest request = WebRequest.Create(serviceUrl);
WebResponse response = request.GetResponse();
  • Cambiar el nombre de su controlador de ServiceController. Puede que también desee considerar el atributo de enrutamiento. asp.net/web-api/overview/web-api-routing-and-actions/…
  • También, usted debe utilizar el POST para las actualizaciones, no CONSEGUIR!!!
  • El retorno de los parámetros (lastUpdate y priceId y costo) son provenientes de un servicio rastreador proyecto y como no tiene ninguna referencias a la obra principal de los modelos de dominio que se vio obligado a pasar en LLEGAR.
  • eso no es una razón válida, todavía puedes publicar los valores sin tener una referencia para el modelo de dominio, es sólo un conjunto de claves los pares de valores que el modelo de cuaderno va a leer para rellenar el modelo en el lado del servidor.
  • Sí, pero mi modelo de precio contiene un montón de otras propiedades y no puedo enviar a la api. Sólo tengo la PriceId y Costo.
  • el objeto de pasar a la API no tiene que ser el modelo en sí, se podría crear un public class PriceUpdate { public int PriceId {get;set;} public decimal Cost{get;set;}} que usted publique en el controlador y, a continuación, carga el registro y actualización se basa en los valores. El problema con hacer un GET, es que una solicitud de lectura puede cambiar los datos que no se espera que el comportamiento de

InformationsquelleAutor Hamid Reza | 2014-10-15

2 Comentarios

  1. 5

    Así que tienes incorrecta el nombre del controlador (debería termina con *Controlador) y el mal de las rutas. Trate de cambiar el nombre de su controlador para ServiceController y actualización de sus rutas como que:

    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{priceId}/{cost}/{lastUpdate}",
        defaults: new { controller = "service", action="updateprice", priceId = RouteParameter.Optional, cost = RouteParameter.Optional, lastUpdate = RouteParameter.Optional}
    );

    Y formato de su dirección como la siguiente:

    string serviceUrl = string.Format("http://localhost:26769/api/service/updateprice/{0}/{1}/{2}", priceId, cost, DateTime.Now);
        WebRequest request = WebRequest.Create(serviceUrl);
        WebResponse response = request.GetResponse();

    Y agregar [HttpGet] atributo en su UpdatePrice acción:

    public class Service : ApiController
    {
        PriceApplication priceApp = new PriceApplication();
        [HttpGet]
        public int UpdatePrice(int priceId,int cost,DateTime lastUpdate)
        {
            try
            {
                var price = priceApp.GetByPriceId(priceId);
                price.Cost = Convert.ToDecimal(cost);
                price.LastUpdate = lastUpdate;
                priceApp.Update(price);
                return cost;
            }
            catch
            {
                return -1;
            }
        }
    }
    • He recibido 500 Malo error de Solicitud y la que me quita el lastUpdate propiedad de la cadena de consulta y de enrutamiento y ahora me sale este error: El servidor remoto devolvió un error: (405) Método No Permitido.
    • 500 error relacionado con mal formato de fecha. Trate de ISO o de formato dd-MM-aaaa (no puede recordar que se utiliza en datetime modelo de cuaderno). De 405 también no muy claro que poco han hecho en su acción y el envío de solicitud Get.. tal vez trate de decorar su acción con HttpGet o intentar acceder a ese enlace desde el navegador para ver cuál es la diferencia.
    • es el uso de [HttpGet] que se requiere o es sólo una convención general ?
    • es necesario, de lo contrario va a ser de pago a POST (a menos que el verbo puede ser resuelto desde el nombre de acción por ejemplo, si empieza con Get, Put, Delete, etc, como PutComment).
    • Muchas gracias. He visto que muchos lugares y no sabía si eso era algo necesario o una convención general.
  2. 0
    1. Como otros han dicho, el nombre de todos sus controladores debe terminar en Controller. Esta es una convención que predeterminados del MVC y WebAPI. Si desea cambiar para WebAPI que usted necesita para escribir una costumbre IHttpControllerTypeResolver.

    2. Sólo es necesario disponer de un detallado ruta si desea que su URL de parámetros que se vea bien. Si no, api/{controller}/{action}/{id} con id opcional está bien. Parámetros adicionales de enviar acaba de terminar para arriba en la cadena de consulta.

    3. Uso HttpUtility.UrlEncode(param) para cada parámetro antes de la construcción de la URL si vas a enviar objetos a través de la ruta o de la cadena de consulta. Si vas a enviar a ellos a través de la solicitud de cuerpo (POST o PUT) puede enviar como ellos son.

Dejar respuesta

Please enter your comment!
Please enter your name here