문제

이것은 WSS/SharePoint 전문가에 대한 질문입니다.

이 시나리오를 고려하십시오. 회사 CRM 시스템과 WSS 기반 인트라넷을 연결하는 ASP.NET 웹 서비스가 있습니다. 내가하려는 것은 새로운 클라이언트가 CRM 시스템에 추가 될 때마다 새로운 WSS 사이트 컬렉션을 제공하는 것입니다. 이 작업을 수행하려면 새로운 사이트 컬렉션에 관리되는 경로를 프로그래밍 방식으로 추가해야합니다. 나는 이것이 객체 모델을 통해 가능하다는 것을 알고 있지만, 내 웹 서비스에서 시도하면 실패합니다. 아래 샘플 코드 추출 :


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

이 코드는 spitility.validateformDigest ()에 대한 nullReferenceException으로 실패합니다. 연구에 따르면 이것은 불충분 한 권한으로 인한 것일 수 있다고 제안했으며, SPSECURITY.RUNWITHELEVATEDPRIVILEGES (AddrendEvmanagedPath)를 사용하여 높은 권한 블록 내에서 코드를 실행하려고 시도했습니다.

그런 다음 InvalidoPerationException으로 실패합니다. "현재의 상태로 인해 작동이 유효하지 않습니다."

내가 어디로 잘못 가고 있습니까?

내가 관리 한 한 가지 해결 방법은 Process.Start ()를 통해 STSADM.Exe로 호출하여 필수 매개 변수를 제공하는 것입니다.

업데이트: 웹 서비스를 개발하는 동안 내장 Visual Studio 2005 웹 서버를 사용하여 실행 중입니다. web.config에 항목을 넣어 보안 컨텍스트를 변경할 수 있습니까?

업데이트: 문제는 올바른 SharePoint 보안 컨텍스트 내에서 웹 서비스를 실행하지 않는 것과 관련이 있다고 생각합니다. 나는 내가 제안한 해결 방법을 가지고 가서 STSADM으로 가기로 결정했지만,이를 수행하기 위해서는 웹 서비스가 실행되는 애플리케이션 풀 ID가 SharePoint 관리자의 구성원이어야합니다.

도움이 되었습니까?

해결책

업데이트나는 당신이 문제가 코드와 관련이 없다는 것을 증명했다고 생각합니다.

spsecurity.runwithelevatedPrivileges : 일반적으로 SharePoint 웹 응용 프로그램의 코드는 작업을 수행하는 사용자의 권한을 실행합니다. runwithelevatedPrivileges는 SharePoint 웹 애플리케이션 풀 계정의 맥락에서 코드를 실행합니다. MSDN 세부 사항으로 조금 더 들어갈 수 있습니다.

통화의 문제는 웹 서비스가 실제로 SharePoint 프로세스 내에서 코드를 실행하지 않으므로 왜 IT가 상승 할 수 없는지 설명합니다 (Wild Berson Alert).

웹 서비스 애플리케이션 풀의 사용자를 변경하는 데 균열이 생겨서 기쁨이 있는지 확인하십시오.


허가 문제 일 가능성이 높습니다. 시도해 볼 수 있습니다 :

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 Application 기능 페이지에서 기능 활성화에서 Activate 기능은 지정된 웹 애플리케이션에서 새로운 명시 적 관리 경로를 만듭니다 (하드 코딩을 Properties.feature.peature, 또는 유사한 것으로 바꾸려고합니다.)

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