Как сохранить экземпляр ссылки на веб-сервис в хранимой процедуре SQLCLR? - PullRequest
0 голосов
/ 06 января 2012

На данный момент у меня есть служба Windows, написанная на C #, которая ожидает сообщения в SQL Server Service Broker, и при получении вызывает метод веб-службы с подробностями, передаваемыми в сообщении.

Я хочу заменить это хранимой процедурой SQLCLR, которая напрямую вызывает веб-сервис, что я считаю довольно простым.Затем я могу вызвать это с помощью внутренней активации.

Однако для каждого метода необходимо создать новый экземпляр веб-службы, и, как я обнаружил, на это уходит некоторое время.В службе Windows я создаю его с ленивым созданием экземпляра в статическом классе, но я понимаю, что статические поля нельзя использовать для хранения информации в SQLCLR.

Есть ли способ сохранить эту ссылку на веб-сервис?

Редактировать: Вот ленивый код инстанции, ссылающийся на синглтон, который я хотел бы сохранить:

static class WsSingleton
{
    static MWs.MWS mWS = null;

    public static MWs.MWS GetMWS()
    {
        if (mWS == null)
        {
            mWS = new MWs.MWS();
            mWS.Credentials = new System.Net.NetworkCredential("user", "password", "domain");
        }
        return mWS;
    }
}

1 Ответ

2 голосов
/ 06 января 2012

необходимо создать новый экземпляр веб-сервиса для каждого метода

Вы имеете в виду, что клиент должен создавать прокси-сервер для каждого HTTP-вызова, который он выполняет? Если это то, что вы имеете в виду вы не должны сохраняться какие-либо ссылки. Внутренняя активированная процедура запускается, когда есть сообщения для обработки, и она может оставаться активной и работающей. Такое состояние locl может быть экземпляром прокси, используемым для выполнения вызовов WWW. Обычно процедура запускает цикл и сохраняет состояние в стеке как локальные переменные метода цикла. См. Написание процедур Service Broker для получения более подробной информации. Точнее, ваш код должен содержать не RECEIVE одно сообщение за раз, а набор сообщений.

Но я бы не советовал делать то, что ты делаешь. Прежде всего, делать HTTP-вызовы из SQLCLR - плохая идея. Выполнение любой блокировки типа в SQLCLR - это плохо, а блокирование при ожидании ответа битов из intertubez - особенно плохо. Внутренние ресурсы SQL Server, особенно рабочие , слишком ценны и их мало, чтобы тратить их впустую, ожидая ответа от какой-либо службы WWW. Я бы посоветовал сохранить вещи такими, какие они есть, а именно, должен ли HTTP-вызов происходить из внешнего процесса.

Второй комментарий, который у меня есть, заключается в том, что вам лучше использовать таблицу в качестве очереди. См. Использование таблиц в качестве очередей . Типичная проблема с очередями HTTP-вызовов заключается в том, что WWW очень ненадежен, и вы должны учитывать тайм-ауты и повторные попытки. Использование таблицы в качестве очереди может сделать это проще, чем настоящая очередь компонента Service Broker. При использовании SSB вам придется полагаться на таймеры разговора для надежных повторных попыток, и это значительно усложняет вашу логику активации.

...