Хранение одного клиентского прокси wcf для всего приложения - PullRequest
1 голос
/ 20 февраля 2012

У меня высоконагруженный веб-сайт ASP .NET MVC2 и служба WCF, которую использует этот сайт. Раньше я создавал один прокси каждый раз, когда мне это нужно, и даже не закрывал его. Обратитесь к моему предыдущему вопросу (с моей большой благодарностью за пользователя SO Richard Blewett ) Я обнаружил, что должен закрыть этот прокси. В противном случае это будет успешное ограничение сеансов.

Теперь я создаю прокси-приложение, которое запускается один раз, а затем просто проверяю его и воссоздаю, если это необходимо. Итак, вот код:

public static bool IsProxyValid(MyServ.MyService client) {
    bool result = true;
    if ((client == null) || (client.State != System.ServiceModel.CommunicationState.Opened) // || (client.InnerChannel.State != CommunicationState.Opened)
        )            
        result = false;

    return result;
}

public static AServ.AServClient GetClient(HttpContext http) {            
    if (!IsProxyValid((MyService)http.Application["client"]))
        http.Application["client"] = new MyService();
    return (MyService)http.Application["client"];
}

public static MyServ.MyService GetClient(HttpContextBase http)
{
    if (!IsProxyValid((MyService)http.Application["client"]))
        http.Application["client"] = new MyService();
    return (MyService)http.Application["client"];
}

public ActionResult SelectDepartment(string departments)
    {
       try
        {
            MyService svc = CommonController.GetClient(this.HttpContext);                
            Department[] depsArray = svc.GetData(departments);

            // .... I cut here ....

            return View();
        }
        catch (Exception exc)
        {
            // log here                
            return ActionUnavailable();
        }
    }

Итак, что вы, ребята, думаете об этом? Должно ли это работать правильно? Иногда мое приложение зависало. Я думаю, что это потому, что состояние прокси-клиента определяет неправильно, и приложение пытается использовать сломанный прокси.


РЕДАКТИРОВАНИЕ ПОЧТЫ

Также в TCP Monitor я вижу множество установленных соединений от сайта к сервису. Почему он создает много соединений вместо использования одного глобального? Может быть, какое-то исключение произошло при вызове метода service, переводящего его в состояние отказа?

Надеюсь на вашу помощь, ребята!

1 Ответ

1 голос
/ 20 февраля 2012

Я думаю, вам нужно прервать канал, если он выйдет из строя перед созданием нового и Обязательно закройте / отмените старый клиент, если вы создаете новый клиент, используйте что-то подобное для этого (этот используется с DI в синглтоне)

public class MyServiceClientInitializer : IMyServiceClientInitializer
 {
        [ThreadStatic]
        private static MyServ.MyService _client;

        public MyServ.MyService Client
        {
            get
            {
                if (_client == null
                    || (_client.State != CommunicationState.Opened
                            && _client.State != CommunicationState.Opening))
                    IntializeClient();

                return _client;
            }
        }

        private void IntializeClient()
        {
            if (_client != null)
            {
                if (_client.State == CommunicationState.Faulted)
                {
                    _client.Abort();
                }
                else
                {
                    _client.Close();    
                }
            }

            string url = //get url;

            var binding = new WSHttpBinding();
            var address = new EndpointAddress(url);

            _client = new MyServ.MyService(binding, address);            
        }
}
...