.svc заменить пользовательским расширением [duplicate]

Js - однопоточная.

blockquote>

Браузер можно разделить на три части:

1) Event Loop

2 ) Web API

3) Очередь событий

Событие Loop запускается вечно, т. Е. Тип бесконечного цикла. Очередь ожидания - это то, где вся ваша функция нажимается на какое-либо событие (пример: нажмите) this один за другим выполняется в очереди и помещается в цикл «Событие», который выполняет эту функцию и подготавливает ее для следующего после первого запуска. Это означает, что выполнение одной функции не начинается до тех пор, пока функция, перед которой она в очереди не будет выполнена цикл событий.

Теперь давайте подумаем, что мы поставили две функции в очереди, чтобы получить данные с сервера, а другой использует эти данные. Мы сначала нажали функцию serverRequest () в очереди, а затем применили функцию Data () , Функция serverRequest переходит в цикл событий и делает вызов на сервер, так как мы никогда не знаем, сколько времени потребуется для получения данных с сервера, поэтому ожидается, что этот процесс займет много времени, и поэтому мы заняли наш цикл событий, тем самым повесив нашу страницу, вот где Web API входит в эту роль, он принимает эту функцию из цикла событий и обращается к серверу, создающему цикл событий, так что мы можем выполнить следующую функцию из очереди. Следующая функция в очереди - useData (), которая идет в цикле, но из-за отсутствия данных отходы и выполнение следующей функции продолжаются до конца очереди (это называется Async-вызовом, то есть мы можем сделать что-то еще, пока не получим данные)

Предположим, что наша функция serverRequest () имела оператор возврата в код, когда мы возвращаем данные с сервера Web API, будет выталкивать его в очередь в конце очереди. По мере того, как он заканчивается в очереди, мы не можем использовать его данные, поскольку в нашей очереди нет функции, чтобы использовать эти данные. Таким образом, невозможно вернуть что-то из Async Call.

Таким образом, решение этой проблемы callback или обещают .

A Изображение из одного из ответов здесь, правильно объясняет использование обратного вызова ... Мы (функция, использующая данные, возвращаемые с сервера), чтобы вызвать вызывающий сервер.

 function doAjax(callbackFunc, method, url) {
  var xmlHttpReq = new XMLHttpRequest();
  xmlHttpReq.open(method, url);
  xmlHttpReq.onreadystatechange = function() {

      if (xmlHttpReq.readyState == 4 && xmlHttpReq.status == 200) {
        callbackFunc(xmlHttpReq.responseText);
      }


  }
  xmlHttpReq.send(null);

}

В моем коде он называется

function loadMyJson(categoryValue){
  if(categoryValue==="veg")
  doAjax(print,"GET","http://localhost:3004/vegetables");
  else if(categoryValue==="fruits")
  doAjax(print,"GET","http://localhost:3004/fruits");
  else 
  console.log("Data not found");
}

Прочитайте здесь новые методы в ECMA (2016/17) для создания асинхронного вызова (@Felix Kling Answer сверху) https://stackoverflow.com/a/14220323/7579856

50
задан Jude 13 May 2015 в 12:19
поделиться

7 ответов

В IIS 7 вы можете использовать Url Rewrite Module , как описано в этом блоге post .

В IIS 6 вы можете написать модуль http , который перепишет url:

public class RestModule : IHttpModule
{
    public void Dispose() { }

    public void Init(HttpApplication app)
    {
        app.BeginRequest += delegate
        {
            HttpContext ctx = HttpContext.Current;
            string path = ctx.Request.AppRelativeCurrentExecutionFilePath;

            int i = path.IndexOf('/', 2);
            if (i > 0)
            {
                string svc = path.Substring(0, i) + ".svc";
                string rest = path.Substring(i, path.Length - i);
                ctx.RewritePath(svc, rest, ctx.Request.QueryString.ToString(), false);
            }
        };
    }
}

И есть хороший пример как получить неограниченные URL-адреса в IIS 6 без использования сторонних модулей ISAPI или сопоставления с подстановочными знаками.

30
ответ дан Darin Dimitrov 26 August 2018 в 12:53
поделиться

В IIS6 или 7 вы можете использовать IIRF , бесплатный фильтр перезаписи. Вот правило, которое я использовал:

# Iirf.ini
#

RewriteEngine ON
RewriteLog  c:\inetpub\iirfLogs\iirf-v2.0.services
RewriteLogLevel 3
StatusInquiry  ON  RemoteOk
CondSubstringBackrefFlag *
MaxMatchCount 10

# remove the .svc tag from external URLs
RewriteRule  ^/services/([^/]+)(?<!\.svc)/(.*)$    /services/$1.svc/$2  [L]
2
ответ дан Cheeso 26 August 2018 в 12:53
поделиться

Легко на IIS 7 - используйте [r0r] модуль повторного URL-адреса

В IIS 6 я нашел его самым легким в использовании ISAPI Rewrite module , который позволяет вы определяете набор регулярных выражений, которые отображают запрос Urls в файл .svc ...

2
ответ дан Eran Kampf 26 August 2018 в 12:53
поделиться

Существует также способ полностью исключить физические файлы .svc. Это можно сделать с помощью VirtualPathProvider.

См.: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/350f2cb6-febd-4978- ae65-f79735d412db

3
ответ дан Jason Kresowaty 26 August 2018 в 12:53
поделиться

Добавьте это в свой global.asax

private void Application_BeginRequest(object sender, EventArgs e)
{
    Context.RewritePath(System.Text.RegularExpressions.Regex.Replace(
               Request.Path, "/rest/(.*)/", "/$1.svc/"));
}

Это заменит / rest / Service1 / arg1 / arg2 на /Service1.svc/arg1/arg2

1
ответ дан Kenneth 26 August 2018 в 12:53
поделиться

Вот более подробная информация с использованием модуля перезаписи IIS 7 или с использованием настраиваемого модуля: http://www.west-wind.com/Weblog/posts/570695.aspx

4
ответ дан Rick Strahl 26 August 2018 в 12:53
поделиться

Я знаю, что это сообщение немного устарело, но если вы используете .NET 4, вам следует посмотреть URL-маршрутизацию (представленную в MVC, но представленную в основном ASP.NET).

В вашем приложении start (global.asax) просто введите следующую строку настройки маршрута, чтобы настроить маршрут по умолчанию:

RouteTable.Routes.Add(new ServiceRoute("mysvc", new WebServiceHostFactory(), typeof(MyServiceClass)));

, тогда ваши URL-адреса выглядели бы так:

http://servername/mysvc/value/2

НТН

45
ответ дан Thiago Silva 26 August 2018 в 12:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: