لماذا يتم تعليق إجراء SQL Server CLR في استدعاء GetResponse () لخدمة الويب

StackOverflow https://stackoverflow.com/questions/4229185

سؤال

البيئة: C#، .NET 3.5 ، SQL Server 2005

لدي طريقة تعمل في مشروع تطبيق C# مستقل C#. إنه ينشئ XMLelement من البيانات الموجودة في قاعدة البيانات ويستخدم طريقة خاصة لإرسالها إلى خدمة ويب على شبكتنا المحلية. عند الركض من VS في مشروع الاختبار هذا ، فإنه يعمل في أقل من 5 ثوان.

لقد قمت بنسخ الفصل إلى مشروع CLR ، وقمت ببنائه ، وقمت بتثبيته في SQL Server (مع إذن _set = external_access). الفرق الوحيد هو مكالمات SQLContext.pipe.send () التي أضفتها لتصحيح الأخطاء.

أقوم باختباره باستخدام أمر تنفيذ واحد مخزّن (في CLR) من نافذة استعلام SSMS. لا يعود أبدًا. عندما أتوقف عن تنفيذ المكالمة بعد دقيقة ، فإن آخر شيء يتم عرضه هو "استدعاء getResponse () باستخدام http: // servername: 53694/odata.svc/customer/". أي أفكار حول سبب عدم إرجاع استدعاء getResponse () عند التنفيذ داخل SQL Server؟

private static string SendPost(XElement entry, SqlString url, SqlString entityName)
{
    // Send the HTTP request
    string serviceURL = url.ToString() + entityName.ToString() + "/";
    HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(serviceURL);
    request.Method = "POST";
    request.Accept = "application/atom+xml,application/xml";
    request.ContentType = "application/atom+xml";
    request.Timeout = 20000;
    request.Proxy = null;

    using (var writer = XmlWriter.Create(request.GetRequestStream()))
    {
        entry.WriteTo(writer);
    }

    try
    {
        SqlContext.Pipe.Send("Calling GetResponse() using " + request.RequestUri);
        WebResponse response = request.GetResponse();
        SqlContext.Pipe.Send("Back from GetResponse()");

        /*
        string feedData = string.Empty;

        Stream stream = response.GetResponseStream();
        using (StreamReader streamReader = new StreamReader(stream))
        {
            feedData = streamReader.ReadToEnd();
        }
        */

        HttpStatusCode StatusCode = ((HttpWebResponse)response).StatusCode;
        response.Close();

        if (StatusCode == HttpStatusCode.Created /* 201 */ )
        {
            return "Created @ Location= " + response.Headers["Location"];
        }

        return "Creation failed; StatusCode=" + StatusCode.ToString();
    }
    catch (WebException ex)
    {
        return ex.Message.ToString();
    }
    finally
    {
        if (request != null)
            request.Abort();

    }
}
هل كانت مفيدة؟

المحلول

تحولت المشكلة إلى إنشاء محتوى الطلب من XML. الأصلي:

using (var writer = XmlWriter.Create(request.GetRequestStream()))
{
    entry.WriteTo(writer);
}

استبدال العمل:

    using (Stream requestStream = request.GetRequestStream())
    {
        using (var writer = XmlWriter.Create(requestStream))
        {
            entry.WriteTo(writer);
        }
    }

نصائح أخرى

تحتاج إلى التخلص من webresponse. خلاف ذلك ، بعد بضع مكالمات ، يذهب إلى المهلة.

أنت تطلب مشكلة في القيام بذلك في CLR. وأنت تقول أنك تدعو هذا من الزناد؟ هذا ينتمي إلى طبقة التطبيق.

أشياء مثل هذا هي السبب عندما خرجت وظيفة CLR ، كانت DBAs قلقة للغاية بشأن كيفية إساءة استخدامها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top