В следующем примере, который я написал, показано, как
Этот рабочий пример является автономным. Он будет определять простой объект запроса, который использует объект window XMLHttpRequest
для совершения вызовов. Он будет определять простую функцию, чтобы дождаться завершения кучи обещаний.
Контекст. В этом примере запрашивается конечная точка Spotify Web API для поиска объектов playlist
для заданного набора строк запроса:
[
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
Для каждого элемента новый Promise запустит блок - ExecutionBlock
, проанализирует результат, заплатит новый набор обещаний на основе массива результатов, который представляет собой список объектов Spotify user
и выполняет новый HTTP-вызов в ExecutionProfileBlock
асинхронно.
Затем вы можете увидеть вложенную структуру Promise, которая позволяет вам генерировать множественные и полностью асинхронные вложенные HTTP-вызовы и присоединять результаты к каждому подмножеству вызовов через Promise.all
.
NOTE Recent Spotify search
API-интерфейсам потребуется указать токен доступа в заголовках запроса:
-H "Authorization: Bearer {your access token}"
Итак, вы должны запустить следующий пример, вам нужно поместить маркер доступа в заголовки запроса:
var spotifyAccessToken = "YourSpotifyAccessToken";
var console = {
log: function(s) {
document.getElementById("console").innerHTML += s + "
"
}
}
// Simple XMLHttpRequest
// based on https://davidwalsh.name/xmlhttprequest
SimpleRequest = {
call: function(what, response) {
var request;
if (window.XMLHttpRequest) { // Mozilla, Safari, ...
request = new XMLHttpRequest();
} else if (window.ActiveXObject) { // Internet Explorer
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch (e) {
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e) {}
}
}
// State changes
request.onreadystatechange = function() {
if (request.readyState === 4) { // Done
if (request.status === 200) { // Complete
response(request.responseText)
}
else
response();
}
}
request.open('GET', what, true);
request.setRequestHeader("Authorization", "Bearer " + spotifyAccessToken);
request.send(null);
}
}
//PromiseAll
var promiseAll = function(items, block, done, fail) {
var self = this;
var promises = [],
index = 0;
items.forEach(function(item) {
promises.push(function(item, i) {
return new Promise(function(resolve, reject) {
if (block) {
block.apply(this, [item, index, resolve, reject]);
}
});
}(item, ++index))
});
Promise.all(promises).then(function AcceptHandler(results) {
if (done) done(results);
}, function ErrorHandler(error) {
if (fail) fail(error);
});
}; //promiseAll
// LP: deferred execution block
var ExecutionBlock = function(item, index, resolve, reject) {
var url = "https://api.spotify.com/v1/"
url += item;
console.log( url )
SimpleRequest.call(url, function(result) {
if (result) {
var profileUrls = JSON.parse(result).playlists.items.map(function(item, index) {
return item.owner.href;
})
resolve(profileUrls);
}
else {
reject(new Error("call error"));
}
})
}
arr = [
"search?type=playlist&q=%22doom%20metal%22",
"search?type=playlist&q=Adele"
]
promiseAll(arr, function(item, index, resolve, reject) {
console.log("Making request [" + index + "]")
ExecutionBlock(item, index, resolve, reject);
}, function(results) { // Aggregated results
console.log("All profiles received " + results.length);
//console.log(JSON.stringify(results[0], null, 2));
///// promiseall again
var ExecutionProfileBlock = function(item, index, resolve, reject) {
SimpleRequest.call(item, function(result) {
if (result) {
var obj = JSON.parse(result);
resolve({
name: obj.display_name,
followers: obj.followers.total,
url: obj.href
});
} //result
})
} //ExecutionProfileBlock
promiseAll(results[0], function(item, index, resolve, reject) {
//console.log("Making request [" + index + "] " + item)
ExecutionProfileBlock(item, index, resolve, reject);
}, function(results) { // aggregated results
console.log("All response received " + results.length);
console.log(JSON.stringify(results, null, 2));
}
, function(error) { // Error
console.log(error);
})
/////
},
function(error) { // Error
console.log(error);
});
Я подробно рассмотрел это решение здесь .
Вы можете сделать это следующим образом:
var urlBuilder =
new System.UriBuilder(Request.Url.AbsoluteUri)
{
Path = Url.Action("Action", "Controller"),
Query = null,
};
Uri uri = urlBuilder.Uri;
string url = urlBuilder.ToString();
// or urlBuilder.Uri.ToString()
Вместо Url.Action()
в этом примере вы также можете использовать Url.Content()
или любой метод маршрутизации или просто просто пройти путь.
Но если URL-адрес переходит к Controller
Action
, существует более компактный способ:
var contactUsUriString =
Url.Action("Contact-Us", "About",
routeValues: null /* specify if needed */,
protocol: Request.Url.Scheme /* This is the trick */);
. Трюк здесь в том, что как только вы укажете protocol
/ схема при вызове любого метода маршрутизации, вы получаете абсолютный URL-адрес. Я рекомендую это, когда это возможно, но у вас также есть более общий путь в первом примере, если вам это нужно.
Я подробно рассказал об этом здесь: http: // gurustop. net / blog / 2012/03/23 / writing-absolute-urls-to-other-actions-in-asp-net-mvc /
Извлечено из Meligy's AngularJS & amp; Web Dev Goodies Newsletter
blockquote>
В ASP.Net Core 2.0 (MVC) это работает, чтобы создать абсолютный URL-адрес для действия.
var url = Url.Action("About", "Home", new { /*Route values here*/ }, Request.Scheme);
Я написал для этого вспомогательный класс, для MVC 5 ... Он довольно гибкий и особенно полезен, если вам нужна эта функциональность, когда вы не находитесь внутри контроллера. Вы должны уметь перенести его прямо в проект и пойти.
Как отметил Мелиги, ключ должен включать протокол. Здесь у меня это жестко закодировано как http, поэтому, если вы хотите использовать SSL, который может оказаться немного более гибким.
public class AbsoluteUrlHelper
{
/// <summary>
/// Creates an absolute "fully qualified" url from an action, and assumes the current controller.
/// </summary>
/// <returns></returns>
public static string GetAbsoluteUrl(string action, object routeValues = null)
{
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
var values = urlHelper.RequestContext.RouteData.Values;
var controller = values["controller"].ToString();
return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
}
/// <summary>
/// Creates an absolute "fully qualified" url from an action and controller.
/// </summary>
public static string GetAbsoluteUrl(string action, string controller, object routeValues = null)
{
var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
return GetAbsoluteUrl(action, controller, urlHelper, routeValues);
}
/// <summary>
/// Creates an absolute "fully qualified" url from an action and controller.
/// </summary>
public static string GetAbsoluteUrl(string action, string controller, UrlHelper urlHelper, object routeValues = null)
{
var uri = urlHelper.Action(action, controller, routeValues, "http");
return uri;
}
}
Встроенные помощники в MVC 4 создают абсолютные URL-адреса, если параметры host
или protocol
не являются пустыми. См. этот ответ здесь с примером метода расширения для использования в представлениях.
Это работает для меня:
using System;
using System.Web;
using System.Web.Mvc;
public static class UrlExtensions
{
public static string Content(this UrlHelper urlHelper, string contentPath, bool toAbsolute = false)
{
var path = urlHelper.Content(contentPath);
var url = new Uri(HttpContext.Current.Request.Url, path);
return toAbsolute ? url.AbsoluteUri : path;
}
}
Использование в cshtml:
@Url.Content("~/Scripts/flot/jquery.flot.menuBar.js", true)
У вас есть несколько вариантов:
Внутри контроллера:
var path = VirtualPathUtility.ToAbsolute(pathFromPoco);
var url = new Uri(Request.Url, path).AbsoluteUri