Подтвердить что ты не робот

Почему мы не можем добавить веб-API в качестве "служебной ссылки" в Visual Studio так же, как мы можем с WCF или ASMX?

Я решил использовать Web API (как средний уровень) для приложения, которое я разрабатываю, но не могу понять, как его "привязать" к интерфейсу (передняя часть - ASP.NET MVC4). Обычно я бы просто щелкнул "Службы" на передней панели, выберите "Добавить ссылку на службу" и поместите URL-адрес моей службы. Но с помощью Web API я не могу этого сделать. Каковы некоторые параметры создания класса прокси-сервера клиента из моего веб-API, который будет использоваться в моем интерфейсе, и почему не добавляется поддержка веб-API в качестве ссылки так же, как добавлен WCF или ASMX?

4b9b3361

Ответ 1

Вы имеете в виду веб-сервис Rest? В разделе "Отдых" нет страницы определения службы, например, с WCF или ASMX. Обычно люди хотят использовать Rest API с JSON.. однако.. если вы просто ищете выход JSON и хотите, чтобы ваши клиенты быстро могли подключиться к вашему сервису, вы должны рассмотреть OData. Это очень легко создать, и это делает ваш уровень данных доступным для большого количества клиентских языков. У них есть клиентская библиотека OData, переносимая на тонну языков. Представлено в качестве ответа, как было предложено.:)

Ответ 2

почему поддержка веб-API не добавляется как ссылка так же, как добавлен WCF или ASMX.

Веб-службы на основе WCF или ASMX основаны на SOAP и обычно связаны с WSDL. WSDL позволяет создавать инструменты для создания прокси-классов и всего этого, но ASP.NET Web API предназначен для создания служб REST (или HTTP) и метаданных в виде WSDL или чего-либо подобного и, следовательно, добавления ссылки на службу через VS не применимо для ASP.NET Web API. WADL (Язык описания веб-приложений) должен быть WSDL для REST, но спецификация не указана где.

Ответ 3

Здесь можно найти общий клиент 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;
        }
    }
}