none
ASP.net WEBアプリでctrl+f5で実行すれば問題ないですが発行すればエラーになります RRS feed

  • 質問

  • using (ClientContext clientContext = new ClientContext("http://nar-cla500s3/"))
                {
                    KeywordQuery keywordQuery = new KeywordQuery(clientContext);
                    keywordQuery.QueryText = @"Path:\\";
                    keywordQuery.SelectProperties.Add("Title");
                    keywordQuery.RowLimit = 200;
                 
                    SearchExecutor searchExecutor = new SearchExecutor(clientContext);
                    ClientResult<ResultTableCollection> results = searchExecutor.ExecuteQuery(keywordQuery);
                    try
                    {
                        clientContext.ExecuteQuery();
                    }
                    catch (Exception ee) { Label1.Text = ee.Message; }
                        foreach (var resultRow in results.Value[0].ResultRows)
                        {               Label1.Text = Label1.Text + resultRow["Title"]; };

    ASP.net Web アプリケーションでこんなものを作りました。

    ClientContextでSharepointの検索APIを使ってファイルを検索するものです。

    これをVisualStudioでctrl+5を押すとうまく動作します。

    しかし、これを発行して実行すればエラーになります。

    まずIISで aspという名前で8080ポートを使うアプリケーションプールを作りました、そして発行を押して発行ぼうぼう:Web Deploy 、サーバー:LocalHost、サイト名:asp、構成:Release - Any CPUを選択して発行しました、発行したファイルは開発サーバーPCにそのまま配置します。

    IISマネージャーのaspサイトのコンテンツビューで発行されたaspxファイルを参照するとサイトには接続できますがボタンを押して上のソースを実行すると

    foreach (var resultRow in results.Value[0].ResultRows) <-ここでエラーを返します。

    メッセージは*オブジェクト参照がオブジェクト インスタンスに設定されていません。 *です。

    これはたぶんClientContextのほうの接続ができなかったからresults.Value[0].ResultRowsに値が入ってないのでインデックスが設定されてないとか言っているのではないかと予想しています(配列の使い方を調べるときあんなエラーを見た覚えがあるので)

    発行の方法が間違っているのか、またIISやアクセス権限などの問題なのか分からないです...

    ctrl+f5で実行した場合のURlはhttp://localhost:56974/WebForm2.aspx

    発行した場合はhttp://localhost:8080/WebForm2.aspx

    です。これが関係あるかは分かりませんが位一応書いておきますおきます。

    よろしくお願いします。

    2013年9月20日 6:25

回答

  • 以前、別スレッドで、ASP.NET 開発サーバーと IIS の違いについてレスしましたが、このあたりのことは理解されているでしょうか?

    以下に同じレスを書いておきますので読んでください。

    *** ここから ***
    開発マシンで IIS を使用する設定をしないで Web アプリを動かすと([デバッグ(D)]⇒[デバッグ開始(S)]または[デバッグなしで開始(H)])、ASP.NET 開発サーバー上で実行されるはずです。
     
    開発サーバーは手軽で便利ですが、開発マシンで IIS が使えるのであれば、開発サーバーを開発に利用するのは避けたほうがいい(IIS を使うべき)と思います。
     
    詳しくは以下のページを見てください。
     
    ASP.NET 開発サーバーと IIS
    http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspx
    *** ここまで ***

    多分、アクセス権の問題で results が得られてない(null になっている)からではないかと思います。IIS のワーカープロセスに適切なアクセス権を与えたら解決するのではないでしょうか。試してみてください。


    • 編集済み SurferOnWww 2013年9月20日 11:26 誤字訂正
    • 回答の候補に設定 星 睦美 2013年9月24日 0:31
    • 回答の候補の設定解除 Gs.NangChun 2013年9月24日 6:14
    • 回答としてマーク Gs.NangChun 2013年9月24日 6:14
    2013年9月20日 8:57
  • まず質問が間違っていました。

    foreachでエラーになっているのはClientContextでエラーになっていたのでresultに値がなかったからです。

    エラーは401エラーで、認証のエラーでした、私もIISの問題化と思いましたがIISではなくSharepointのアクセス認証のエラーだったようです。

    ソースに

    clientContext.Credentials = new System.Net.NetworkCredential("アドレス", "パスワード", "ドメイン");

    を書くことで401エラーが解決できました。これで一応解決はできましたがソース上にあんなもの書くのはセキュリティ上悪いみたいです。

    とにかくあれで解決できました。

    IISの設定でも方法がありました、ASP.NETのアプリケーションプルの詳細設定でプロセスモデルのIDをSharepointに接続できるIDに設定すると401エラーは直ります。

    しかし、ソースに各方法も、IISで設定を変える方法もSharepointにアクセスするアカウントをひとつに設定してしまうので接続するユーザーに対して権限を換えることなどはできないと思います。

    なのでケルベロスか何かあるようですのでそれを使うかほかの方法を探したほうがいいと思います。

    • 回答としてマーク Gs.NangChun 2013年9月24日 6:05
    • 回答としてマークされていない Gs.NangChun 2013年9月24日 6:09
    • 編集済み Gs.NangChun 2013年9月24日 6:14
    • 回答としてマーク Gs.NangChun 2013年9月24日 6:14
    2013年9月24日 6:05

すべての返信

  • 以前、別スレッドで、ASP.NET 開発サーバーと IIS の違いについてレスしましたが、このあたりのことは理解されているでしょうか?

    以下に同じレスを書いておきますので読んでください。

    *** ここから ***
    開発マシンで IIS を使用する設定をしないで Web アプリを動かすと([デバッグ(D)]⇒[デバッグ開始(S)]または[デバッグなしで開始(H)])、ASP.NET 開発サーバー上で実行されるはずです。
     
    開発サーバーは手軽で便利ですが、開発マシンで IIS が使えるのであれば、開発サーバーを開発に利用するのは避けたほうがいい(IIS を使うべき)と思います。
     
    詳しくは以下のページを見てください。
     
    ASP.NET 開発サーバーと IIS
    http://surferonwww.info/BlogEngine/post/2011/11/18/ASPNET-development-server-and-IIS.aspx
    *** ここまで ***

    多分、アクセス権の問題で results が得られてない(null になっている)からではないかと思います。IIS のワーカープロセスに適切なアクセス権を与えたら解決するのではないでしょうか。試してみてください。


    • 編集済み SurferOnWww 2013年9月20日 11:26 誤字訂正
    • 回答の候補に設定 星 睦美 2013年9月24日 0:31
    • 回答の候補の設定解除 Gs.NangChun 2013年9月24日 6:14
    • 回答としてマーク Gs.NangChun 2013年9月24日 6:14
    2013年9月20日 8:57
  • マルチポストされているので URL を貼っておきます。

    http://social.msdn.microsoft.com/Forums/ja-JP/03199566-6c07-4806-a5a6-17c52eff650c/how-can-i-publish-my-application-use-sharepoint-api-in-aspnet-web-application

     

    質問者さん>

    基本的にマルチポストはマナー違反と認識ください。フォーラムの参加者に対して失礼ということで嫌う人が多いです。個人的には絶対ダメとは言いませんが、最低限マルチポスト先を書いておいていただければと思います。そうすれば、検索などでこのページにたどり着いた閲覧者が、このページで解決策を得られなくても、URL をたどって解決策を得られるかもしれませんので。

    2013年9月21日 0:32
  • SurferOnWwwさん。

    マルチポストの件大変失礼いたしました。

    マナー違反とまでは考えが及びませんでした、もっと慎重に質問するように気をつけます。

    ご指摘と回答ありがとうございます。

    2013年9月24日 1:10
  • まず質問が間違っていました。

    foreachでエラーになっているのはClientContextでエラーになっていたのでresultに値がなかったからです。

    エラーは401エラーで、認証のエラーでした、私もIISの問題化と思いましたがIISではなくSharepointのアクセス認証のエラーだったようです。

    ソースに

    clientContext.Credentials = new System.Net.NetworkCredential("アドレス", "パスワード", "ドメイン");

    を書くことで401エラーが解決できました。これで一応解決はできましたがソース上にあんなもの書くのはセキュリティ上悪いみたいです。

    とにかくあれで解決できました。

    IISの設定でも方法がありました、ASP.NETのアプリケーションプルの詳細設定でプロセスモデルのIDをSharepointに接続できるIDに設定すると401エラーは直ります。

    しかし、ソースに各方法も、IISで設定を変える方法もSharepointにアクセスするアカウントをひとつに設定してしまうので接続するユーザーに対して権限を換えることなどはできないと思います。

    なのでケルベロスか何かあるようですのでそれを使うかほかの方法を探したほうがいいと思います。

    • 回答としてマーク Gs.NangChun 2013年9月24日 6:05
    • 回答としてマークされていない Gs.NangChun 2013年9月24日 6:09
    • 編集済み Gs.NangChun 2013年9月24日 6:14
    • 回答としてマーク Gs.NangChun 2013年9月24日 6:14
    2013年9月24日 6:05
  • ASP.NETのアプリケーションでSharepointの接続権限を持っているIDを指定したら解決できました。

    ありがとうございます。

    2013年9月24日 6:16
  • > ASP.NETのアプリケーションでSharepointの接続権限を持っているIDを指定したら
    > 解決できました。

    その ID が持っている権限によってはセキュリティ上の問題があるかもしれませんので注意してください。

    セキュリティ上、IIS のワーカープロセスには必要最低限の権限しか与えないのが基本です。そのため、Windows Server 2008 R2 の IIS7.5 ではデフォルトで ApplicationPoolIdentity が IIS のワーカープロセスのアカウントになっているはずです。

    Application Pool Identities
    http://www.iis.net/learn/manage/configuring-security/application-pool-identities

    可能であれば、このアカウントに「Sharepointの接続権限」を与えることをお勧めします(具体的にどうやるのかは Sharepoint の知識のない自分には分かりませんが)。


    • 編集済み SurferOnWww 2013年9月24日 7:35 誤字訂正
    2013年9月24日 7:34