Я хочу перевести существующий веб-сайт в SPA с поддержкой REST из WebApi 2. Я не хочу, чтобы службы были частью моего существующего проекта, но я хотел бы иметь возможность отправлять запросы из JavaScript на свой уровень веб-API. Было бы неплохо, если бы я мог использовать api.mywebsite.com, но браузеры будут блокировать междоменный запрос.

Вместо этого я предполагаю, что мне придется добавить что-то, чтобы захватить определенный маршрут, например: mysite.com/api/*. Как правильно это сделать? Кажется, я не могу найти никаких ресурсов, которые рассказывают о том, чтобы делать что-то подобное.

Я пытаюсь создать что-то подобное с помощью одностраничного приложения. Тем не менее, я хочу позвонить прямо в веб-api из своего клиента.

.net framework orginization

1
Walt 7 Мар 2014 в 00:18
Является ли сайт, на который вы добавляете проект API, веб-сайтом MVC?
 – 
snowYetis
7 Мар 2014 в 00:22
Поэтому я планировал просто создать пустой проект Web Api 2 и разместить его на сервере. У меня есть веб-сайт, на который я хочу указать, — это приложение .net Webforms.
 – 
Walt
7 Мар 2014 в 00:29
Похоже, вы там. Возможно, я неправильно понимаю ваш пост, но не могли бы вы делать запросы к WebAPI из своего приложения WebForm?
 – 
snowYetis
7 Мар 2014 в 02:23
Я бы смог из слоя WebForm. Я надеялся делать запросы непосредственно из JavaScript и пропускать уровень WebForm. Для этого у меня должен быть какой-то форвардер или прокси. Я не знаю, какое лучшее решение? Я неправильно понимаю эту часть архитектуры?
 – 
Walt
7 Мар 2014 в 04:00
Вы определенно можете сделать это с помощью Javascript. Я считаю, что вы можете легко сделать это с помощью AJAX... Если сайты находятся в разных доменах, вы можете использовать JSONP для междоменных запросов. Сделайте запрос AJAX Get. Ваш URL будет выглядеть примерно так... url: 'localhost:6606/api/values/GetTest' Это ответ на твой вопрос? Я могу уточнить в форме ответа, если это так.
 – 
snowYetis
7 Мар 2014 в 07:10

2 ответа

Лучший ответ

Если вы хотите разделить Сервис и приложение, у вас есть несколько вариантов:

  1. Используйте JSONP. Он поддерживает только запросы GET. Это может работать, если ваше приложение время от времени выполняет запросы GET к некоторому общедоступному API (например, Twitter), но это не подходит для приложения, ориентированного на данные, со многими запросами в стиле Restfull или RPC.

  2. Используйте CORS. . Это стандарт W3C, который позволяет серверу ослабить политику одного и того же происхождения. Используя CORS, сервер может явно разрешить одни запросы из разных источников, отклоняя другие. Одним из недостатков этого варианта является то, что он поддерживает только IE10 +. См. Дополнительную поддержку просмотра CORS. Включение запросов между исходными данными в Веб-API ASP.NET.

  3. Разделите приложение и службу, но разместите их в одном домене.

2
Community 23 Май 2017 в 15:06
Как выглядят типичные реализации варианта 3? Это то, что я хотел сделать. Есть ли какая-то особая конфигурация в IIS? Должен ли я тогда писать какой-то прокси в своем веб-приложении?
 – 
Walt
7 Мар 2014 в 20:31
1
Если вы размещаете свой веб-сайт в IIS, вы можете щелкнуть правой кнопкой мыши на веб-сайте и выбрать «Добавить приложение», указать на свою службу веб-API.
 – 
Erikas Pliauksta
7 Мар 2014 в 21:38

Итак, у вас есть веб-API в одном домене и ваше одностраничное приложение в другом. Вот пример того, как вы можете вызывать действия веб-API из одностраничного JS-приложения.

WebAPI

public Book GetBook(int id)
{
    Book book = _repository.Get(id);
    if (book == null)
    {
        throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));`
    }
    return book;
}

Выше показан ваш метод веб-API. Я предполагаю, что вы уже обо всем этом позаботились. Ниже приведен код AJAX, который вызовет ваш метод API.

$.ajax({
    url: 'http://myurl.com/<controllerName>/GetBook',
    type: 'GET',
    dataType: 'jsonp',
    success: function (data) {
        alert(data.msg);
    }
})

Я считаю, что это все, что вам нужно. Вы можете использовать Fiddler для просмотра обмена данными. Вывод будет в формате JSON.

1
Community 20 Июн 2020 в 12:12
Это отлично сработало бы для публичных запросов на получение, но похоже, что Эрикас сказал правду, и он поддерживает только получение. Мне нужно, чтобы он поддерживал все глаголы REST.
 – 
Walt
7 Мар 2014 в 20:32
2
Я позволю Эрикасу ответить на вопрос, но я думаю, что все, что вам нужно сделать, это зайти в IIS и добавить его в свой пул приложений. Я думаю, вы даже можете рассматривать его как вспомогательное приложение основного приложения.
 – 
snowYetis
7 Мар 2014 в 20:59