web-dev-qa-db-ja.com

WCFやASMXの場合と同じように、Visual Studioで「サービス参照」としてWeb APIを追加できないのはなぜですか?

開発中のアプリに(中間層として)Web APIを使用することにしましたが、フロントエンド(フロントエンドはASP.NET MVC4)に「関連付ける」方法を理解できないようです。事業)。通常は、フロントエンドで[サービス]を右クリックし、[サービス参照の追加]を選択して、サービスのURLを入力します。しかし、Web APIではそれができません。フロントエンドで使用するWeb APIからクライアントプロキシクラスを作成するためのオプションにはどのようなものがありますか。また、WCFまたはASMXを追加するのと同じ方法でWeb APIサポートが参照として追加されないのはなぜですか。

28
Mike Marks

Rest Webサービスを意味しますか? Restでは、WCFやASMXのようなサービス定義ページはありません。通常、JSONでRest APIを使用したいと考えていますが、JSON出力を探しているだけで、クライアントがサービスにすばやく接続できるようにしたい場合は、ODataを検討する必要があります。作成は非常に簡単で、多数のクライアント言語がデータレイヤーにアクセスできるようになります。彼らは、ODataクライアントライブラリを多数の言語に移植しています。要求に応じて、回答として提出。 :)

19
Slack Shot

wCFまたはASMXを追加するのと同じ方法で、Web APIサポートが参照として追加されないのはなぜですか

WCFまたはASMXベースのWebサービスはSOAPベースであり、通常は関連するWSDLがあります。 WSDLを使用すると、ツールを構築してプロキシクラスなどを生成できますが、ASP.NET Web APIはREST(またはHTTPベースの)サービスを構築するためのものであり、次の形式のメタデータはありません。 WSDLまたは同様のもの、したがってVSを介してサービス参照を追加することは、ASP.NET Web APIには適用されません。WADL(Webアプリケーション記述言語)は、RESTどこ。

12
Badri

ここには、一般的なWebAPIクライアントがあります。

https://github.com/CamSoper/CamTheGeek

要求されたように、それはプロキシではありませんが、ギャップを埋めます。

これがソースコードです:

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