Take the 2-minute tour ×
SharePoint Stack Exchange is a question and answer site for SharePoint enthusiasts. It's 100% free, no registration required.

I have never really had too much cause to use this method before but I am developing some generic classes to deal with column, content type and list management for use in a series of features.

My ListHelper class has a method called DeleteList which looks like this:

        Public Shared Function DeleteList(ByVal List As SPList, ByVal Operation As DeleteOperation) As Boolean

        If Operation = DeleteOperation.DeleteWithBackup Or Operation = DeleteOperation.ForcedDeleteWithBackup Then
            SaveListAsTemplate(List, True)
        End If

        If Operation = DeleteOperation.ForcedDelete Or Operation = DeleteOperation.ForcedDeleteWithBackup Then
            If List.AllowDeletion = False Then
                List.AllowDeletion = True
                List.Update()
            End If
        End If

        Try
            List.Delete()
        Catch ex As Exception
            Return False
        End Try

        Return True

    End Function

This is very much a work in progress, but I am having trouble with the SaveListAsTemplate method which looks like this:

        Public Shared Function SaveListAsTemplate(ByVal List As SPList, ByVal SaveContent As Boolean) As String

        If HttpContext.Current IsNot Nothing Then
            Dim tmpFileName As String = List.Title & "_saved_" & Now.ToFileTimeUtc & ".stp"
            List.SaveAsTemplate(tmpFileName, List.Title, "list template saved programmatically", SaveContent)
            Return List.ParentWeb.Site.Url & "/_catalogs/lt/" & tmpFileName
        Else
            Throw New Exception("List template cannot be saved unless the code is running in a valid HttpContext")
        End If

    End Function

The reason for the check into HttpContext is possibly not required, this is the reason for my post. I cannot get this code to execute from within a console application. Does the SPList.SaveAsTemplate method require a HttpContext? If it does it is not metioned in any of the docs that I have seen.

As an aside any other comments on this code gratefully received.

EDIT: Exception and Stack Trace

System.ArgumentException "Value does not fall within the expected range" at Microsoft.SharePoint.SPGlobal.HandleException(Exception ex) at Microsoft.SharePoint.SPList.SaveAsTemplate(String strFileName, String strName, String strDescription, Boolean bSaveData)
at XXXXXX.SharePoint.Lists.ListHelper.SaveListAsTemplate(SPList List, Boolean SaveContent) in C:\SharePoint Development Projects\XXXXXX.SharePoint\XXXXXX.SharePoint\Lists\ListHelper.vb:line 145 at XXXXXX.SharePoint.Lists.ListHelper.DeleteList(SPList List, DeleteOperation Operation) in C:\SharePoint Development Projects\XXXXXX.SharePoint\XXXXXX.SharePoint\Lists\ListHelper.vb:line 121 at XXXXXX.SharePoint.Lists.ListHelper.DeleteList(SPWeb Web, String ListName, DeleteOperation Operation) in C:\SharePoint Development Projects\XXXXXX.SharePoint\XXXXXX.SharePoint\Lists\ListHelper.vb:line 111 at XXXXXX_Feature_Receiver.XXXXXXDataStructureFeatureFactory.CreateOrUpdateListInstances(SPWeb Web) in C:\TestBed\XXXXXX Feature Receiver Development\XXXXXX Feature Receiver\XXXXXXDataStructureFeatureFactory.vb:line 37 at XXXXXX_Feature_Receiver.XXXXXXDataStructureFeatureFactory.Initiate(SPWeb Web) in C:\TestBed\XXXXXX Feature Receiver Development\XXXXXX Feature Receiver\XXXXXXDataStructureFeatureFactory.vb:line 14 at XXXXXX_Feature_Receiver.Module1.Main() in C:\TestBed\XXXXXX Feature Receiver Development\XXXXXX Feature Receiver\Module1.vb:line 11 at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart()"

share|improve this question
    
what happens when you run it from a Console Application? Do you get an exception? If so, could you please post the exception, including the stacktrace? –  Jaap Vossers Feb 3 '10 at 13:40
    
It throws an InvalidArgumentException. The stack trace points to the global exception handler in the SPList.SaveAsTemplate method. –  Charles Lee Feb 3 '10 at 13:45
    
There is no exception message? –  Jaap Vossers Feb 3 '10 at 15:02
    
value does not fall within the expected range –  Charles Lee Feb 3 '10 at 15:44
    
using Reflector, I can see that SPList.SaveAsTemplate does do something with the HttpContext. Could you please post the FULL stack trace? –  Jaap Vossers Feb 3 '10 at 16:23
show 1 more comment

3 Answers

Do you have the proper permissions to perform a template save to the Site Template Gallery? The identity executing the code must be site collection administrator if it mimics the user experience.

share|improve this answer
    
Interesting point! –  Jaap Vossers Feb 4 '10 at 15:35
    
Yes the code is being run in a console app by a user with Full Control via Web App Policy. The user is also in the Farm admins group so pormissions is not likely to be the issue. –  Charles Lee Feb 5 '10 at 8:56
add comment

Not sure why it would behave differently in a Console App, but I would try saving the template with a very basic filename for the .stp

Remove the timestamp just for testing purposes, as this could contain characters that are invalid to SharePoint.

share|improve this answer
    
I have tried with "temp.stp" but to no avail. I am wondering if the issue is with the way in which I am getting a reference to the SPList object. –  Charles Lee Feb 3 '10 at 15:46
add comment

You will often get this error if the filename already exists at the location you are trying to save it. SaveListAsTemplate will not override an existing file. Additionally it could be an invalid character in the filename, I found this API is more restricting than the Windows FileSystem for filenames, it does not allow certain characters even though they are valid for the filesystem. In addition if it works fine within a web and not within the console try to add AllowUnsafeUpdates right before the SaveAsTemplate call since a Console app will not have a security context.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.