سؤال

هذا سؤال لجورو WSS/SharePoint.

ضع في اعتبارك هذا السيناريو: لدي خدمة ويب ASP.NET التي تربط نظام CRM CRM وشركتنا القائمة على WSS معًا. ما أحاول القيام به هو توفير مجموعة مواقع WSS جديدة كلما تمت إضافة عميل جديد إلى نظام CRM. من أجل جعل هذا العمل ، أحتاج إلى إضافة المسار المُدار برنامجياً إلى مجموعة الموقع الجديدة. أعلم أن هذا ممكن عبر نموذج الكائن ، لكن عندما أجربه في خدمة الويب الخاصة بي ، فإنه يفشل. عينة رمز استخراج أدناه:


Dim _ClientSiteUrl As String = "http://myintranet/clients/sampleclient"

        Using _RootWeb As SPSite = New SPSite("http://myintranet")

            Dim _ManagedPaths As SPPrefixCollection = _RootWeb.WebApplication.Prefixes

            If Not (_ManagedPaths.Contains(_ClientSiteUrl)) Then

                _ManagedPaths.Add(_ClientSiteUrl, SPPrefixType.ExplicitInclusion)

            End If

        End Using

فشل هذا الرمز مع nullreferenceException على sputility.validateformDigest (). أشارت الأبحاث إلى أن هذا قد يكون بسبب عدم كفاية الامتيازات ، حاولت تشغيل الكود ضمن كتلة امتيازات مرتفعة باستخدام spsecurity.runwithelevatedprivileges (addressof addmanagedpath) ، حيث يعد AddmanagedPath إجراءً فرعيًا يحتوي على عينة الرمز أعلاه.

هذا يفشل بعد ذلك مع invalidoperationexception ، "العملية غير صالحة بسبب الوضع الحالي للكائن."

هل أنا على خطأ؟

أحد الحلول التي تمكنت من القيام بها هي الاتصال بـ Stsadm.exe عبر Process.start () ، وتوفير المعلمات المطلوبة ، وهذا يعمل.

تحديث: أثناء تطوير خدمة الويب ، أقوم بتشغيلها باستخدام خادم الويب المدمج في Visual Studio 2005 - ما سياق الأمان الذي سيتم تشغيله؟ هل يمكنني تغيير سياق الأمان عن طريق وضع الإدخالات في web.config؟

تحديث: أعتقد أن المشكلة تتعلق بالتأكيد بعدم تشغيل خدمة الويب في سياق أمان SharePoint الصحيح. قررت أن أذهب مع الحل البديل الذي اقترحته وصقله إلى STSADM ، على الرغم من القيام بذلك ، يجب أن تكون هوية تجمع التطبيقات التي تعمل عليها خدمة الويب عضوًا في مسؤولي SharePoint.

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

المحلول

تحديثأعتقد أنك أثبتت أن المشكلة ليست مع الكود.

spsecurity.runwithelevatedprivileges: عادةً ما يتم تنفيذ الكود في تطبيق SharePoint على الويب بامتيازات المستخدم الذي يتخذ الإجراء. يقوم RunwitheLevatedPrivileges بتشغيل الرمز في سياق حساب تجمعات تطبيقات الويب SharePoint (على ما أظن) الوصف على MSDN يمكن أن تذهب إلى التفاصيل قليلا قليلا.

قد تكون المشكلة في المكالمة هي أن خدمة الويب لا تعمل فعليًا على الكود ضمن عملية SharePoint ، لذا فإن شرح سبب عدم قدرتها على الارتفاع (تنبيه التخمين البري).

احصل على صدع في تغيير مستخدم تجمع تطبيقات خدمات الويب الخاص بك ومعرفة ما إذا كان ذلك يعطي أي فرحة.


من المحتمل أن تكون مشكلة أذونات. ربما حاول:

Dim clientSiteUrl As String = "http://myintranet/clients/sampleclient"
Using SPSite = new SPSite(clientSiteUrl) 
    webApp As SPWebApplication = SPWebApplication.Lookup(new Uri(clientSiteUrl));
    If Not (webApp.Prefixes.Contains(clientSiteUrl)) Then
        webApp.Prefixes.Add(clientSiteUrl, SPPrefixType.ExplicitInclusion)
    End If
End Using

هذا ليس رمزًا دقيقًا.

نصائح أخرى

نظرًا لأن الرمز أعلاه ليس هو الرمز الدقيق ، فإليك رمز العمل الدقيق لميزة تطبيق تطبيق الويب في الحدث الذي تم تنشيطه في الميزة:

عند تنشيط الميزات في صفحة ميزات تطبيق MANGE Web ، ستنشئ ميزة Activate مسارًا جديدًا تم إدارته الصريح في تطبيق الويب المحدد (أريد استبدال الترميز الثابت ، ربما بـ Properties.Feature.Parent ، أو شيء مشابه.)

using (SPSite site = new SPSite("http://dev-moss07-eric/PathHere")) {
    SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
    if (webApp.Prefixes.Contains("PathHere"))
    {
        //
    }
    else
    {
        webApp.Prefixes.Add("PathHere", SPPrefixType.ExplicitInclusion);
    }
}

ربما يمكن تحسين الكود ، ولكن محاولتي لتحويل الكود أعلاه.

إذا كنت ترغب في إنشاء مسار مُدار (صريح) ومجموعة موقع في هذا المسار ، فقم بما يلي:

using (SPSite site = new SPSite("http://dev-moss07-eric")) {
                SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric"));
                if (webApp.Prefixes.Contains("ManagedPathHere"))
                {
                    //
                }
                else
                {
                    webApp.Prefixes.Add("ManagedPathHere", SPPrefixType.ExplicitInclusion);
                }
                using (SPWeb web = site.OpenWeb())
                {
                    SPWebApplication webApplication = web.Site.WebApplication;
                    try
                    {
                        webApplication.Sites.Add("ManagedPathHere","Site Title Here","This site is used for hosting styling assets.", 1033, "STS#1", "6scdev\\eric.schrader", "Eric Schrader", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top