Comment puis-je appeler un WebApi méthode de MVC Méthode d'Action du Contrôleur?
Comment puis-je appeler une méthode de l'API Web MVC, à partir d'un contrôleur d'action de la méthode. C'est ce que j'essaie, c'est ma méthode de contrôleur:
public ActionResult ProductDetail(long id)
{
using (var client = new HttpClient())
{
var productDetailUrl = Url.RouteUrl(
"DefaultApi",
new { httproute = "", controller = "ProductDetails", id = id },
Request.Url.Scheme
);
var model = client
.GetAsync(productDetailUrl)
.Result
.Content.ReadAsAsync<ProductItems>().Result;
return View(model);
}
}
De mon site Web méthode de l'API:
private ProductEntities products = new ProductEntities();
public IEnumerable<ProductItems> GetProductDetail(int ID)
{
var produc= products.ExecuteStoreQuery<ProductItems>(
"GetProductDetail @ProductID ",
new SqlParameter("@ProductID", ID));
return produc;
}
Quand je fais cela, j'obtiens une erreur @ modèle de la var dans mon MVC méthode d'action après la restitution des données en disant
"Newtonsoft.Json.JsonSerializationException: Impossible de désérialiser JSON
tableau "(c'est à dire [1,2,3]) dans le type 'ProductDetails.Modèles.ProductItems'.
Le désérialisé type doit être un tableau ou mettre en œuvre une collection
interface comme interface IEnumerable, ICollection ou IList. À force de tableaux JSON
pour désérialiser ajouter le JsonArrayAttribute le type. Ligne 1,
la position 1."
Quelqu'un peut-il m'aider à faire cela...ou me suggérer un autre meilleur méthode ou corrigez-moi si je suis en train de faire mal n'importe où... je dois montrer les données renvoyées à mon avis... les données doivent être retournés à mon contrôleur
- Je voudrais utiliser ProductItem au lieu de ProductItems pour la classe/nom de l'objet. Et à l'aide de la "var" mot entrave ces sortes de déterminer les problèmes, à mon humble avis.
Vous devez vous connecter pour publier un commentaire.
Comme l'exception des états "Ne peut pas désérialiser tableau JSON ..." vous avez un problème sur le côté du récepteur.e.g avec la désérialisation pas dans votre site web méthode de l'api avec la sérialisation.
Et votre problème est que vous essayez de désérialiser dans le mauvais type parce que votre site web api méthode ressemble à ceci:
On en revient donc
IEnumerable<ProductItems>
(par exemple, un tableau deProductItems
) mais dans votre contrôleur de l'action que vous essayez de désérialiser la réponse dans unProductItems
avec l'appelReadAsAsync<ProductItems>()
Donc changer votre
ReadAsAsync
pour désérialiser dans un tableauProductItems
et cela devrait fonctionner:ProductDetail.cshtml
où vous avez je suppose que@model ProductDetails.Models.ProductItems
. Si votre webapi méthode de toute façon retourner seulProductItems
vous pouvez écrirereturn View(model[0]);
dans votre contrôleur. Ou changer votre webapi méthode pour renvoyer uniquement lesProductItems
au lieu deIEnumerable<ProductItems>
...Lorsque votre ASP.NET site web d'hébergement avec l'API Web ensuite, le contrôleur vous pouvez appeler des Web API de la classe ordinaire méthode pour éviter les retards liés à la requête HTTP.
Et le problème n'est pas dans le Web, les appels de l'API. Le problème est dans le résultat de la désérialisation, qui vient de ExecuteStoreQuery, assurez-vous d'avoir serializable de la collection en elle. Pour être sûr, vous pouvez simplement essayer de convertir cette méthode résultat de la liste avant de retour et de retour de l'api web méthode serializable liste, puis de situer le problème.
UPD: Donc, la racine du problème est dans ce que ExecuteStoreQuery méthode retourne. Il retourne ObjectResult. Il fait implémentant IEnumerable, mais il est retourné à partir de EF et, dans certains cas, il y a par exemple cyclique des dépendances entre les objets, qui Json deserialzers ne pouvait pas résoudre.
Pour résoudre le problème simplement de convertir explicitement ObjectResult par exemple de Liste:
Quand le problème est en fait un cycle de dépendances dans les collections de vos objets qui viennent de l'EF, vous pouvez l'éteindre en Json.NET
Et également de vérifier de votre côté client de la désérialisation:
Mais quand vous êtes à l'hébergement de votre ASP.NET MVC site et ASP.NET l'API Web dans un projet, vous n'avez pas besoin de toutes ces choses avec la requête HTTP et la sérialisation/désérialisation, il suffit d'appeler votre méthode ordinaire de la méthode de classe.