プログラムでファイルをモジュールを使用してスタイルライブラリにプログラム的にデプロイするときの無効なURLエラー

sharepoint.stackexchange https://sharepoint.stackexchange.com//questions/49447

  •  09-12-2019
  •  | 
  •  

質問

SharePoint Server 2010のスタイルライブラリにWebPartに共通のファイルを展開する機能を使用し、最近、最近ファイルが更新されていない機能に遭遇しました。 (注:「バージョン」という用語はここでゆるく使用しています - 私たちは私たちのWebPartsをバージョン管理していません)。 検索後、この問題(すなわち、モジュールはファイルの初期バージョンを展開するが更新されない)が多数のブログに文書化されていることがわかりました。ファイルを更新するには、Peatureceiverを使用してプログラム的に実行する必要があります。私はいくつかの異なる解決策を見つけました:

サンドボックスウェブパートソリューションの場合:

http:// stefan- stanev-sharepoint-blog.blogspot.com.au/2011/01/0/01/0utoMally-publishing-files.html

ファームウェブパートソリューションの場合:

http://johanleino.wordpress. .com / 2009/04/22 / HOWTO処理 - ファイルアップデート - in-sharepoint /

私は両方の解決策を試してみましたが、私たちのシナリオのためのいくつかの小さな微調整でヨハンの解決策と一緒に行くことになった。

私はヨハンのコードを走らせたときにNullReferenceExceptionを遭遇しましたが、これは私たちのモジュール要素にパス属性を持っていないためでした。 URL属性を取得するための呼び出しでパス属性を取得するための呼び出しを交換しました。 その後、次のエラーが発生しました:

The URL ‘[url]‘ is invalid. It may refer to a nonexistent file or folder, or refer to a valid file or folder that is not in the current Web
.

このエラーのための解決策を概説したさまざまなブログを見つけましたが、私のためにそれを解決したことはありません:

*私は私のように除いて、2つ以上のリンクを投稿できない最低のニュービーです。)*

誰かがログから脇に置かれていないのですか?

注:サンドボックス溶液ではなく、農場のソリューションを使用しています。

役に立ちましたか?

解決

After doing a lot of reading and after debugging the feature receiver, I discovered two things:

  1. One of our files (which was introduced after the original version was deployed but before the current version) didn't exist in the Style Library on the SharePoint site. i.e. it had never been deployed. I checked a couple of our test servers and the file wasn't there either so this confirmed it wasn't isolated to my dev machine. This "missing" file was the file throwing the Invalid URL error when SPWeb.Files.Add was called. I confirmed that the file did exist in the hive and that the Add method could create new files. I had a look at what SPWeb.GetFile() was returning. Interestingly enough, the SPFile object returned when retrieving the "virtual file" had Exists = true... but... the file doesn't exist on the server??? (Interesting post here on SPWeb.GetFile(): http://blog.mastykarz.nl/inconvenient-spwebgetfilestring/). I switched to using GetFileOrFolder() and casting to SPFile but my problem still wasn't resolved.

  2. After looking again at Johan's code, I decided to see if there was something else in the call to Add that could be causing an issue. I re-examined our elements.xml file to see if the entry for the "missing" file was different from the other file entries. This ended up being where my problem was... the entry for the "missing" file didn't have all of the attributes that other entries had. In particular, it was missing the Type and IgnoreIfExists attributes.

    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" />
    

    I updated the entry to be:

    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
    

    I re-deployed the wsp to the SharePoint site and activated the feature. The FeatureReceiver code ran successfully and the files were updated and checked into the Style Library.

    Feature Receiver Properties Extension (I put this in its own class in the same project as the feature):

    using System.Collections;
    using System.Globalization;
    using System.IO;
    using System.Linq;
    using System.Xml.Linq;
    
    using Microsoft.SharePoint;
    using Microsoft.SharePoint.Administration;
    
    /// <summary>
    /// Extension methods for SPFeatureReceiverProperties
    /// </summary>
    public static class SPFeatureReceiverPropertiesExtension
    {
        /// <summary>
        /// Updates the files in module.
        /// </summary>
        /// <param name="instance">The instance.</param>
        public static void UpdateFilesInModule(this SPFeatureReceiverProperties instance)
        {
            var modules = (from SPElementDefinition element in instance.Feature.Definition.GetElementDefinitions(CultureInfo.CurrentCulture)
                           where element.ElementType == "Module"
                           let xmlns = XNamespace.Get(element.XmlDefinition.NamespaceURI)
                           let module = XElement.Parse(element.XmlDefinition.OuterXml)
                           select new
                               {
                                   Url = module.Attribute("Url").Value,
                                   Path = Path.Combine(element.FeatureDefinition.RootDirectory, module.Attribute("Url").Value), // don't have a Path attribute on our Module so changed Path to URL
                                   Files = (from file in module.Elements(xmlns.GetName("File"))
                                            select new
                                                {
                                                    Url = file.Attribute("Url").Value,
                                                    Properties = (from property in file.Elements(xmlns.GetName("Property"))
                                                                  select property).ToDictionary(
                                                                      n => n.Attribute("Name").Value,
                                                                      v => v.Attribute("Value").Value)
                                                }).ToList()
                               }).ToList();
    
            using (SPWeb web = (instance.Feature.Parent as SPSite).OpenWeb())
            {
                modules.ForEach(module =>
                    {
                        module.Files.ForEach(file =>
                            {
                                string hivePath = Path.Combine(module.Path, file.Url); // in 14-hive
                                string virtualPath = string.Concat(web.Url, "/", module.Url, "/", file.Url); // in SPFS
    
                                if (File.Exists(hivePath))
                                {
                                    using (StreamReader streamReader = new StreamReader(hivePath))
                                    {
                                        object obj = web.GetFileOrFolderObject(virtualPath);
    
                                        if (obj is SPFile)
                                        {
                                            SPFile virtualFile = (SPFile)obj;
                                            bool checkOutEnabled = virtualFile.Item == null
                                                                       ? virtualFile.ParentFolder.Item.ParentList.
                                                                             ForceCheckout
                                                                       : virtualFile.Item.ParentList.ForceCheckout;
                                            bool needsApproval = virtualFile.Item == null
                                                                     ? virtualFile.ParentFolder.Item.ParentList.
                                                                           EnableModeration
                                                                     : virtualFile.Item.ParentList.EnableModeration;
    
                                            if (checkOutEnabled)
                                            {
                                                if (virtualFile.CheckOutType != SPFile.SPCheckOutType.None)
                                                {
                                                    virtualFile.UndoCheckOut();
                                                }
                                                virtualFile.CheckOut();
                                            }
    
                                            virtualFile = web.Files.Add(
                                                virtualPath,
                                                streamReader.BaseStream,
                                                new Hashtable(file.Properties),
                                                true);
    
                                            if (checkOutEnabled)
                                            {
                                                virtualFile.CheckIn(
                                                    "Checked in by deployment.", SPCheckinType.MajorCheckIn);
                                            }
    
                                            if (needsApproval)
                                            {
                                                virtualFile.Approve("Approved by deployment.");
                                            }
    
                                            virtualFile.Update();
                                        }
                                    }
                                }
                            });
                    });
            }
        }
    }
    

An excerpt of the elements.xml file for our Module:

<?xml version="1.0" encoding="utf-8"?>
<Elements xmlns="http://schemas.microsoft.com/sharepoint/">
  <Module Name="Style Library" Url="Style Library">
    <File Path="Style Library\Assets\Scripts\JQuery\UI\jquery-ui-1.8.16.custom.js" Url="Assets/Scripts/JQuery/UI/jquery-ui-1.8.16.custom.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\JQuery\UI\jquery-ui-1.8.16.custom.min.js" Url="Assets/Scripts/JQuery/UI/jquery-ui-1.8.16.custom.min.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Resources\search.png" Url="Assets/Resources/search.png" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\Common.js" Url="Assets/Scripts/Common.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />   
    <File Path="Style Library\Assets\Styles\Common.css" Url="Assets/Styles/Common.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Styles\Pager.css" Url="Assets/Styles/Pager.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Styles\sharepoint.theme.overrides.css" Url="Assets/Styles/sharepoint.theme.overrides.css" Type="GhostableInLibrary" IgnoreIfAlreadyExists="TRUE" />
    <File Path="Style Library\Assets\Scripts\JQuery\JQueryDollarFix.js" Url="Assets/Scripts/JQuery/JQueryDollarFix.js" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
    <File Path="Style Library\Assets\Styles\images\arrow.gif" Url="Assets/Styles/images/arrow.gif" Type="GhostableInLibrary" IgnoreIfAlreadyExists="True"/>
  </Module>
</Elements>

Useful links:

* Removed as unable to add more than 2 links *

ライセンス: CC-BY-SA帰属
所属していません sharepoint.stackexchange
scroll top