Comment appeler une méthode dans ApiController avec la requête http?

J'ai un ApiController nommé Service. J'ai une méthode nommée UpdatePrice. Maintenant, je veux envoyer un http requête web à partir d'un autre projet par je recevoir le code d'erreur 404. Et si je l'exécute dans le navigateur, je vois ceci:

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

C'est le 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;
        }
    }
}

C'est le routage:

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

Et c'est la demande:

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();
Renommer votre contrôleur ServiceController. Vous pouvez également envisager d'attribut de routage. asp.net/web-api/overview/web-api-routing-and-actions/...
Aussi, vous devez utiliser la POSTE pour les mises à jour, pas AVOIR!
Le retour de paramètres (lastUpdate et priceId et le coût) sont à venir à partir d'un service de chenille de projet et comme il n'a pas de références pour le projet principal des modèles de domaine j'ai été obligé de le passer en GET.
ce n'est pas une raison valable, vous pouvez toujours afficher les valeurs sans avoir une référence pour le modèle de domaine, c'est juste un ensemble de paires clé-valeur qui le classeur de modèles de lecture pour remplir votre modèle sur le côté serveur.
l'objet que vous passez à l'API n'a pas à être le modèle lui-même, vous pouvez créer une public class PriceUpdate { public int PriceId {get;set;} public decimal Cost{get;set;}} que vous postez sur le contrôleur et ensuite charger le dossier et le mettre à jour sur la base de ces valeurs. Le problème avec un GET est qu'une demande de lecture peut modifier les données qui n'est pas le comportement attendu

OriginalL'auteur Hamid Reza | 2014-10-15