Синхронизация по веб-сервису и вызовам браузера - PullRequest
4 голосов
/ 13 октября 2010

У меня есть HttpHandler, который запрашивает 3 веб-службы в рамках одного запроса и сохраняет результаты в одном файле cookie.

Как вы можете себе представить, результаты конфликтуют.Вот как:

Процесс выглядит следующим образом: когда я запрашиваю службу 1 и ожидаю результата, cookie, сохраняющий результаты, еще не существует, тогда результат приходит из службы 2 и volia, создает файл cookie, сохраняетрезультат, а затем ответ возвращается из службы 1 и перезаписывает этот cookie, что не должно иметь место.

то, что идентификаторы, это поставить в очередь эти запросы.

Должен ли я сделать это на стороне клиентас помощью JavaScript?если да, то как? :) 1009

или на стороне сервера?

, поэтому я не хочу асинхронных вызовов.верно?

вот код:

if(service1.isEnabled){  
   invokeService1();  
}

if(service2.isEnabled){  
   invokeService2();  
}

if(service3.isEnabled){  
   invokeService3();  
}

invokeService1(){
  callToService1();
  // response comes to another HttpHandler, which is a redirect from the service      
}

invokeService2(){
  callToService2();  
  // response comes to another HttpHandler, which is a redirect from the service  
}

invokeService3(){
  callToService3();
  // response comes to another HttpHandler, which is a redirect from the service
}

когда ответы поступают в HttpHandler, он приходит со строкой запроса.

затем в этом HttpHandler:

HttpCookie cookie = request.Cookie.Get(MYCookie) ?? new HttpCookie(MYCookie);  

if(request.Params["foo"]){  
  //set cookie content  
}

if(request.Params["Bar"].isNotNullOrEmpty()){  
//set cookie content  
}

вот как я это установил.Мне кажется, проблема в том, как я создаю cookie,

Ответы [ 2 ]

1 голос
/ 20 октября 2010

Нет, все становится намного проще, если вы полагаетесь на асинхронные вызовы, поэтому вы должны предоставить функции обратного вызова для ваших invokeService и callService , а затем продолжить выполнение обратного вызова.

Попробуйте это:

var cookieData = {};

var callService = function(service, onCalledService) {
    // TODO #1: contact the server to get the cookie data
    // on server callback:
    //     TODO #2:  append the retrieved data to cookieData
    //     and still inside the server callback do: onCalledService();       
};

var invokeService = function(service, onInvokedService) {
    if (service.isEnabled) {
        callService(service, function() {
            onInvokedService();
        });
    } else {
        onInvokedService();
    }
};

invokeService(service1, function () {

    invokeService(service2, function () {

        invokeService(service3, function () {
            // cookieData now has all the data you need, so:
            // TODO #3: set the cookie content
        });

    });

});

Вот что должно произойти:

1. invokeService(service1, ...) will check if service1 is enabled
1.1. if service1 is enabled 
1.1.1. callService(service1, ...)
1.1.2. append the retrieved data to cookieData
1.1.3. call the callback (i.e. go to 2.)
1.2. if service1 is not enabled 
1.2.1. call the callback (i.e. go to 2.)

2. invokeService(service2, ...) will check if service2 is enabled
2.1. if service2 is enabled 
2.1.1. callService(service2, ...)
2.1.2. append the retrieved data to cookieData
2.1.3. call the callback (i.e. go to 3.)
2.2. if service2 is not enabled 
2.2.1. call the callback (i.e. go to 3.)

3. invokeService(service3, ...) will check if service3 is enabled
3.1. if service3 is enabled 
3.1.1. callService(service3, ...)
3.1.2. append the retrieved data to cookieData
3.1.3. call the callback (i.e. go to 4.)
3.2. if service3 is not enabled 
3.2.1. call the callback (i.e. go to 4.)

4. set the cookie content
0 голосов
/ 18 октября 2010

Можете ли вы сериализовать запросы и заставить клиента выдавать их косвенно?

, например:

Первый запрос от клиента

GET /handler.ashx HTTP/1.1
....

Сервер распознает, что в запросе нет cookie.Таким образом, предполагается, что это новое соединение.Ответ сервера с перенаправлением:

HTTP/1.1 302 Moved
Location: http://server.com/handler.ashx?executeService1

Второй запрос от клиента

Теперь клиент отправляет запрос на handler.ashx? ExecuteService1

THeОбработчик получает этот запрос и запрашивает WebService1.И помещает куки в ответ (с другим перенаправлением)

HTTP/1.1 302 Moved
Location: http://server.com/handler.ashx?executeService2
set-cookie: value

Вы поняли?

Преимущество в том, что сервер находится на рукопожатии с клиентом.SErver знает, сколько раз нужно вызывать веб-сервисы, и может использовать для этого куки-файл.

Другой вариант, который вы предложили, - это выполнять на стороне клиента с использованием javascript и AJAX с полезной нагрузкой XML.Когда вызовы веб-службы завершены, вы можете вызвать сервер с результатами вызовов службы, и сервер может установить cookie на клиенте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...