web-dev-qa-db-fra.com

Pourquoi ne pouvons-nous pas ajouter une API Web en tant que «référence de service» dans Visual Studio de la même manière que nous pouvons le faire avec WCF ou ASMX?

J'ai décidé d'utiliser l'API Web (en tant que niveau intermédiaire) pour une application que je développe, mais je n'arrive pas à comprendre comment le "lier" au frontal (le frontal étant un ASP.NET MVC4 projet). Normalement, je fais juste un clic droit sur Services sur le front-end, je choisis "Ajouter une référence de service" et je mets l'URL de mon service. Mais avec l'API Web, je ne peux pas faire ça. Quelles sont les options de création d'une classe de proxy client hors de mon API Web à utiliser sur mon frontal, et pourquoi une prise en charge d'API Web n'est-elle pas ajoutée comme référence de la même manière qu'un WCF ou ASMX est ajouté?

28
Mike Marks

Voulez-vous dire un service Web Rest? Avec Rest, il n'y a pas de page de définition de service, comme avec WCF ou ASMX. Habituellement, les gens veulent utiliser une API Rest avec JSON .. cependant .. si vous cherchez juste une sortie JSON, et que vous voulez que vos clients puissent rapidement se connecter à votre service, vous devriez considérer OData. Il est très facile à créer et rend votre couche de données accessible pour un grand nombre de langues client. Ils ont la bibliothèque cliente OData portée pour une tonne de langues. Soumis comme réponse, comme demandé. :)

19
Slack Shot

pourquoi une prise en charge d'API Web n'est-elle pas ajoutée comme référence de la même manière qu'un WCF ou ASMX est ajouté

Les services Web basés sur WCF ou ASMX sont basés sur SOAP et il y a généralement un WSDL associé. WSDL permet de construire des outils pour générer des classes proxy et tout cela, mais l'API Web ASP.NET est destinée à créer des services REST (ou basés sur HTTP) et il n'y a pas de métadonnées sous la forme de WSDL ou quelque chose de similaire et donc l'ajout d'une référence de service via VS n'est pas applicable pour l'API Web ASP.NET. Le WADL (Web Application Description Language) est censé être le WSDL pour REST mais cette spécification n'a pas été où.

12
Badri

Il existe un client WebAPI générique ici:

https://github.com/CamSoper/CamTheGeek

Ce n'est pas un proxy, comme demandé, mais il comble le vide.

Voici le code source:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;

namespace CamTheGeek
{
    public class GenericWebApiClient<T> : IDisposable where T : class
    {

        HttpClient client = new HttpClient();
        Uri ServiceBaseUri;

        public GenericWebApiClient(Uri ServiceUri)
        {        
            if(ServiceUri == null)
            {
                throw new UriFormatException("A valid URI is required.");
            }
            ServiceBaseUri = ServiceUri;
        }


        public List<T> GetAll()
        {

            var response = client.GetAsync(ServiceBaseUri).Result;
            if(response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsAsync<List<T>>().Result as List<T>;

            }
            else if (response.StatusCode != HttpStatusCode.NotFound)
            {
                throw new InvalidOperationException("Get failed with " + response.StatusCode.ToString());
            }

            return null;
        }

        public T GetById<I>(I Id)
        {
            if (Id == null)
                return default(T);

            var response = client.GetAsync(ServiceBaseUri.AddSegment(Id.ToString())).Result;
            if (response.IsSuccessStatusCode)
            {
                return response.Content.ReadAsAsync<T>().Result as T;
            }
            else if (response.StatusCode != HttpStatusCode.NotFound)
            {
                throw new InvalidOperationException("Get failed with " + response.StatusCode.ToString());
            }

            return null;
        }


        public void Edit<I>(T t, I Id)
        {
            var response = client.PutAsJsonAsync(ServiceBaseUri.AddSegment(Id.ToString()), t).Result;

            if (!response.IsSuccessStatusCode)
                throw new InvalidOperationException("Edit failed with " + response.StatusCode.ToString());
        }


        public void Delete<I>(I Id)
        {
            var response = client.DeleteAsync(ServiceBaseUri.AddSegment(Id.ToString())).Result;

            if (!response.IsSuccessStatusCode)
                throw new InvalidOperationException("Delete failed with " + response.StatusCode.ToString());
        }


        public void Create(T t)
        {
            var response = client.PostAsJsonAsync(ServiceBaseUri, t).Result;

            if (!response.IsSuccessStatusCode)
                throw new InvalidOperationException("Create failed with " + response.StatusCode.ToString());
        }


        public void Dispose(bool disposing)
        {
            if (disposing)
            {
                client = null;
                ServiceBaseUri = null;
            }
        }

        public void Dispose()
        {
            this.Dispose(false);
            GC.SuppressFinalize(this);
        }

        ~GenericWebApiClient()
        {
            this.Dispose(false);
        }

    }

    static class UriExtensions
    {
        public static Uri AddSegment(this Uri OriginalUri, string Segment)
        {
            UriBuilder ub = new UriBuilder(OriginalUri);
            ub.Path = ub.Path + ((ub.Path.EndsWith("/")) ? "" : "/") + Segment;

            return ub.Uri;
        }
    }
}
2
InteXX