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