장애처리 한 내용인데.

Server Error '/' Application

Object reference not set to an instance of an object

Description: An unhandled exception was generated during the execution of the current web request. please review the stack trace for more information about the error and where it orginated in the code.

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error:

An unhandled exception was generated during the execution of the current web request.Information regarding the origin and using the exception stack trace below.

Stack Trace:

[NullReferenceException: Object reference not set to an instance of an object.]

Microsoft.office.server.Administration.UserProfileApplicationProxy.get_ApplicationProperties() +134

Microsoft.office.server.Administration.UserProfileApplicationProxy.get_PartitionIDs() +44

Microsoft.office.server.Administration.UserProfileApplicationProxy.IsAvailable(SPServiceContext ServiceContext) +134

Microsoft.office.server.WebControls.MyLinksRibbon.get_Portal Available() +44

Microsoft.office.server.WebControls.MyLinksRibbon.EnsureMySiteUrls() +60

Microsoft.office.server.WebControls.MyLinksRibbon.get_PortalMySiteUrlAvailable()+15

Microsoft.office.server.WebControls.MyLinksRibbon.OnLoad(EventArgs e) +91

System.Web.UI.Control.LoadRecursive()+65

System.Web.UI.Control.LoadRecursive()+190

System.Web.UI.Control.Page.ProcessRequestMail(Boolean includeStagesBeforeAsyncpoint, Boolean includeStagesAfterAsyncpoint) +2427

 

스택은 이런 식으로 뜰 것이고..

보면 알겠지만 UserProfile 쪽에 문제가 있는 것이다. (왜인지는 모르겠다)

이때, 서비스에 다음 서비스 2개가 시작되어있지 않으면, 유저 프로필 서비스를 아예 배제하고 만들지 않는 한 거의 프로필 문제라고 봐야한다.

 

일단 내가 한 해결방법은. User Profile Service를 중지하였다가 다시 실행시킨 것이다.

 

 이렇게 하니까 앞절의 그 서비스 2개가 시간이 지나서 실행이 되고, 문제가 해결되었다.

 뭐..

 

 그렇다고 -_-ㅋㅋ

 

 

페이지에서 게시를 눌렀는데. 에러가 나더라. (Unexpected.. 어쩌구 하는 짜증나는 에러)

그래서 한번 체크해보았다. 

뭐? -_-; 활성화 되어있는데 저거? 

됐잖아!

 

있잖아!!!

 

정신을 차리고 생각을 해보니, 이 문제의 배경은 내가 저 'SharePoint Server 게시' 활성화를 껐다켰다 했다는 것.

그러니까 뭐가 문제냐면. 활성화를 시켰는데도 불구하고, 정확하게 게시했다는 값이 들어가있지 않았다는것이다.

아니 뭐 제품이 이래 -_-;;

저... 활성화 시켰는데요? -_- 왜 이러세요?

 

그래서. 구글에서 이거 True로 시키는 방법이 있나 없나 조회해보고, 다음과 같은 솔루션을 얻었다.

http://sharepoint.stackexchange.com/questions/1662/publishing-spweb-properties-missing-why-how

 

Power Shell 을 켜고

[System.Reflection.Assembly]::LoadWithPartialName("System.Web") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") | Out-Null 
$Site1
= New-Object Microsoft.SharePoint.SPSite("http://니 사이트 이름") 
$Web1
= $Site1.OpenWeb() 
$Web1
.AllProperties["__PublishingFeatureActivated"]="True" 
$Web1
.Update() 
 

그러니까 True로 되더라

 

역시 외국인 아저씨들은 머리가 좋다.

이러니까 게시도 잘 되고, 페이지도 잘 만들어지더라.

 

아 그리고, 돌아다니다가 하나 더 안건데. 이 경우 True인데도 안되면 속성 하나를 더 확인해보라고 한다.

 

이 __PagesListId 값이 없을 수도 있고, 엉뚱한 값이 들어가있을 수가 있다고 한다.

Pages 라이브러리를 정확하게 지정해야 하니, Id값 확인하고 Shell을 이용하고 업데이트를 해주자.

 

내가 Sharepoint 프로젝트를 할 때, 가장 많이 쓰는 2개의 프로그램 중에 하나다.

직접 설치해서 이거저거 보면 되기때문에, 구체적인 내용은 쓰지 않겠지만. 간략히 이야기하면...

보통 Sharepoint 코딩이라는 것도 결국 WSS_Content 라는 데이터베이스와의 소통이다. 넣고빼고넣고빼고 -_-; 뭐 예를 들어서 어느 사이트의 어느 리스트에 있는 어떤 아이템 중에 최근 10개만 불러와라. 라고 하는것도. 결국은 WSS_Content의 어느 테이블의 어느 리스트의 어느 아이템의 정보가 어떻게 저장되어있는지 캐치해서 적절하게 뭐 SPWeb, SPList 등으로 가져오는 그런 정도?

의의로 Sharepoint가, 데이터 부분에 있어서는 정말 단순한 것 같다. 결국 저장창고는 모두 DB다. 리스트 정보, 컨텐츠 타입 정보, 아이템 정보, 사이트 정보, 웹 정보, 리스트 컬럼 정보... 다 WSS_Content 라는 DB에 때려박는다.

그런데 WSS_Content 라는 DB를 보면 알겠지만, 진짜 복잡하다. 구조를 전혀 모르겠다. 그렇다고 Sharepoint UI 안에서 이 모든 정보를 볼 수 있느냐? 그것도 아니다. 내가 한번은 어떤 List 의 Guid 값이 뭔지 찾아볼라 했는데. 결국 못찾았다. 뭐 여기서 이렇게 가셔서 보시면 되요 라고 친절하게 알려주실 수 있는 분들에게 참 감사하다.

그런데 중요한건 어쨌건 한눈에 안들어왔다는게 중요한거지 -_-; 솔까말 [리스트 설정] 들어가서 그 정보 안보이면 '못보나?' 라고 생각하는게 당연한거 아닌가.

그러다보니 이 아이템에는 어떤 정보가 들어가있고, 이 사이트에는 어떤 컬럼이 있으며.. 뭐 이런거 한눈에 볼 수 있는 방법이 없는가? 를 찾게된다. 이건 실제로 코딩할때도, 쉽게 볼 수 있으면 꽤 유용한 정보가 될 것이다.

출처는 http://spm.codeplex.com/ 이다.  

Release 20110711.zip

 

간단한 스샷! 보통 이렇게 각 요소별로 디테일하게 알려면, 우리는 디버깅을 해야한다 -_-; 어느세월에...

보면 별거 다 있다. Event Receivers, Fields, Lists, Webs, Items 개별 조회 모두 가능하다. 간단하게 각 요소 삭제나 편집이 가능한 항목도 있으니 한번 가지고 놀아(?) 보는것도 좋겠고, 현업에서 현재 Sharepoint 구조상태 조회용으로도 유용하게 사용할 수 있을 것이다. -_-)/

 

아마 SharePoint 코딩을 하다보면 가장 짜증나고 막막한 에러는 다음 유형의 에러가 아닐까. 

뭐 어떻게 하라는지 나와있지도 않고, 어디서 에러가 난건지. 굉장히 뜬금없다.

이럴때, 사실 어느 부분에서 에러가 났는지 LOG 디렉토리에는 다 쌓여있다. 그래? 그럼 로그파일을 보면 무엇이 문제인지 나와있을꺼야. 

... 싸우자는 것도 아니고.

그래서, 외국의 어떤 착하신 분께서 이 로그파일을 쉽게 알아볼 수 있게끔 프로그램을 만들어주셨다. 바로 ULS Viewer 라는 툴이다.  (http://archive.msdn.microsoft.com/ULSViewer)

  UlsViewer.zip

사용방법은 아주 간단하다. 첨부파일을 다운받아 서버에 두고, 관리자 모드로 실행시킨 후에. File -> Open From -> ULS 를 각각 선택한다.

다음 화면에서 그냥 OK를 눌러주면 되겠다.

그러면, 창이 뜨면서, 뭐가 막 쌓인다.  

자세히 보면 사실 앞에서 잠깐 봤었던 황당한 텍스트파일이 정리되어 나오는 것이라는걸 눈치챌 수 있을 것이다. 오 그럼 그게 틀린 로그는 아니구나. 하지만 아까의 텍스트 파일은 너무 무성의했어(...)

이렇게 해 놓은 상태에서 아까의 에러 케이스를 재현시켜보면 여기에 로그가 쌓인단 이야기가 되겠지. 오오..

여기에 있는 에러 ID를 기억했다가..

ULS Viewer에 똑같은 아이디에 Unexpected 라고 되어있는 부분 때문에 에러가 났다고 알려준다. 그 부분을 클릭하면 상세 정보가 나오며, 문제 해결에 '꽤나 큰' 도움을 준다.  

뭐 예를 들어서, 어떤 페이지에 웹파트가 덕지덕지 붙어있을 때 그거 권한에러 한번 나면 난감하다. 그 페이지에 웹파트 100개 붙어있다면 어쩔껀데? 다 떼고 하나씩 다 붙여야되나 -_- 싶을 때 이걸 해보면 어느 웹파트에서 권한오류가 나는지도 조회할 수 있다. 등등.. 기타 여러가지 예외상황을 조회할 수 있다.

이렇게 까지 해서 문제를 해결해야하는 MS를 욕하자 ㅋㅋㅋㅋㅋ 아니 그들 입장에선 개발자도 고객일텐데 뭐 좀 쉽게 만들어주던지 해야할꺼 아닌가.


 http://support.microsoft.com/kb/2483447 에 보면, 명시적으로 못을 박고 있네요.
 (구성원인 유저가 특정 확장자를 가진 파일을 업로드하려고 하면, 아마 Access Denied 라는 창이 뜰 것이다. swf 파일 못올린다)

 -_-;
 참나. 어쩌라고.


 올릴 수 없는 확장자는 다음과 같습니다.

 < ascx, asmx, aspx, jar, master, swf, xap, xsf, xsn >

 딱 보기에, 뭔가 있어보이는 파일들 같긴 합니다. 
 그럼 뭐... 지워야죠.

 파워쉘을 '관리자 권한'으로 실행시켜서 (어드민으로 로그인되어있다면 필요없겠죠) 다음을 입력합니다.
 
 PS c:\> $sa = Get-SPWebApplication - Identity "(어플리케이션 명)"
 
 PS c:\> $sa.WebFileExtensions
ascx
asmx
aspx
jar
master
swf
xap
xsf
xsn        (이러면 이게 죽 나와요 어떤 것들이 막혀있는지)

PS c:\> $sa.WebFileExtensions.Remove("swf")
True       (실행이 되고)

PS c:\> $sa.Update()                      (업데이트)


이렇게 해주시면 됩니다.