InfoPath Forms Services 匿名アクセスで投稿したい! Part 1

 

こんにちは奥田です。

先週 SharePoint Developer Forum 「~インターネットでの SharePoint Server 2007 活用技術~」にて、【SharePoint によるインターネットサイトの設定/管理ノウハウ】と題したセッションを担当させていただきました。お集まりいただいたみなさん、ありがとうございました!

 

弊社では、会社 Web SharePoint におきかえるべく現在作業中なのですが、その中でも設定が大変だった代替アクセスマッピングの設定など、SharePoint をインターネット公開するために必要な設定についてをイベントでお話させていただきました。

 

ただその他にも困ったことが1点あり、、、

Web からのお問い合わせフォームやセミナーの申し込みフォームを InfoPath Forms Services で作りこもうと考えていたのですが、SharePoint では匿名アクセスユーザーにライブラリへの投稿権限を割り当てることができないのです。(リストはできるのに・・・)

 

そこで解決策として、フォームライブラリにファイルを保存する WCF サービスを作成してフロントエンド Web サーバーに展開し、それを InfoPath のデータ接続から呼び出すことにしました。ちょっと長くなりそうなので何回かの投稿に分けてご紹介します。

 

Part 1.WCF サービスの開発

Part 2.WCF サービスの展開

Part 3.バーチャルパスプロバイダの開発と展開

Part 4.InfoPath フォームでのデータ接続

Part 5.InfoPath フォームの発行

 

WCF サービスの開発

1.      Visual Studio で、[WCF サービスライブラリ] プロジェクトを新規作成します。(プロジェクト名は InfoPathWcf とします)

2.      ソリューションエクスプローラで、IService1.cs Service1.cs を削除し、プロジェクトに新しく WCF サービスを追加します。(InfoPathSv.cs IInfoPathSv.cs が作成される)

3.      IInfoPathSv.cs にコントラクトを定義します。

 

[ServiceContract]

public interface IInfoPathSv

{

   [OperationContract]

   void UpLoadFormData(string formData);

}

 

4.      Microsoft.SharePoint.dll を参照設定します。
(C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12ISAPI
)

5.      InfoPath.cs にサービスを実装します。
次の using を追加します。
 

using Microsoft.SharePoint;

using System.Xml;

using System.Text.RegularExpressions;


 6.      InfoPath.cs に次のコードを追加します。

    ここでご紹介したサンプルコードですが、xml ファイル内の PI ヘッダからフォームテンプレートのパスを抜き出し、そこから xml ファイルの保存場所を指定するロジックにしていたのですが、フォームテンプレートは管理者発行が必要なため、このロジックは使えません・・

間違って下記ソースコードを記載してしまったので、訂正します (7/10)

 

     public void UpLoadFormData(string formData)

   {

     SPSecurity.RunWithElevatedPrivileges(delegate { UploadToFormLib(formData); });

  }

 

    private static void UploadToFormLib(string formData)

    {      

      try       

     {                               

       XmlDocument xmlDoc = new XmlDocument();

       xmlDoc.LoadXml(formData); 

     

 XmlProcessingInstruction pi =  (XmlProcessingInstruction)xmlDoc.SelectSingleNode("/processing-instruction("mso-infoPathSolution")"); 

       if (null != pi && !String.IsNullOrEmpty(pi.Value))

       {

         Match m = Regex.Match(pi.Value, "href="(.+?)""); 

         if (m.Success && m.Groups.Count > 1) 

         { 

            string xsnLoc = m.Groups[1].Value; 

            using (SPSite site = new SPSite(xsnLoc))

           { 

             using (SPWeb web = site.OpenWeb())

             { 

               web.AllowUnsafeUpdates = true;

               string libLoc = xsnLoc.Substring(0, xsnLoc.LastIndexOf("/Forms/"));

               SPFolder folder = web.GetFolder(libLoc);

               UTF8Encoding encoder = new UTF8Encoding(); 

               byte[] data = encoder.GetBytes(formData);

            folder.Files.Add(String.Format("{0}/{1}.xml", libLoc, Guid.NewGuid()), data);

              web.AllowUnsafeUpdates = false; 

             } 

           } 

        }

       } 

 

     string siteLoc = http://riku;  // サイトコレクションのパス

     string libLoc = http://riku/Projects/contactus//保存先のライブラリのパス

     using (SPSite site = new SPSite(siteLoc))

     {

        using (SPWeb web = site.OpenWeb("/Projects"))

        {

           web.AllowUnsafeUpdates = true;

           SPFolder folder = web.GetFolder(libLoc);

           if (null == folder)

           {

            throw new Exception("ドキュメントライブラリが見つかりません");

           }

                      

           UTF8Encoding encoder = new UTF8Encoding();

           byte[] data = encoder.GetBytes(formData);

           folder.Files.Add(String.Format("{0}/{1}.xml", libLoc, Guid.NewGuid()), data);

           web.AllowUnsafeUpdates = false;

          }

      }

    } 

   catch (Exception ex)

   { 

     throw new Exception("送信に失敗しました", ex);

   } 

}

      

7.      厳密名を付けてビルドします。

  

Part 1 は以上です。

実は明日 (7/10)、また SharePoint Developer Forum で今度は InfoPath についてのセッションを担当させていただくことになっているのですが、その中で「匿名アクセスで InfoPath Forms Services を活用する方法」としてこの内容をご紹介しようと思っています♪

 

奥田理恵

広告

InfoPath Forms Services 匿名アクセスで投稿したい! Part 1」への1件のフィードバック

  1. ピンバック: SharePoint 2010 カスタム WCF サービスの展開 « クリエ・イルミネート ブログ

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中