Question

Gs.NangChun on Fri, 20 Sep 2013 06:25:44


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

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

よろしくお願いします。


Sponsored



Replies

SurferOnWww on Fri, 20 Sep 2013 08:57:49


以前、別スレッドで、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 on Sat, 21 Sep 2013 00:32:29


マルチポストされているので 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 をたどって解決策を得られるかもしれませんので。

Gs.NangChun on Tue, 24 Sep 2013 01:10:21


SurferOnWwwさん。

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

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

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

Gs.NangChun on Tue, 24 Sep 2013 06:05:30


まず質問が間違っていました。

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 on Tue, 24 Sep 2013 06:16:22


ASP.NETのアプリケーションでSharepointの接続権限を持っているIDを指定したら解決できました。

ありがとうございます。

SurferOnWww on Tue, 24 Sep 2013 07:34:34


> 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 の知識のない自分には分かりませんが)。