からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

CSOM で実行される Web リクエストを取得する

CSOM では内部的に Web リクエストを発行していて、どういうリクエストが流れているかを見るためには Fiddler などのツールを使わないといけないのですが、とても面倒くさいので、コードから取得できるようにしてみました。ちなみに ExecutingWebRequest イベントで取れる e.WebRequestExecutor.GetRequestStream は CanRead が false なので読み取りできません。なのでリフレクションでごにょごにょしています。

public static class Program {

    private static void Main(string[] args) {
        var url = "<サイトの URL>";
        var userName = "<ユーザー名>";
        var rawPassword = "<パスワード>";
        var securePasseord = new SecureString();
        foreach (var c in rawPassword) {
            securePasseord.AppendChar(c);
        }
        using (var ctx = new ClientContext(url)) {
            ctx.Credentials = new SharePointOnlineCredentials(userName, securePasseord);
            ctx.ExecutingWebRequest += (sender, e) => {
                var clientRequestType = ctx.PendingRequest.GetType();
                var buildQueryMethod = clientRequestType.GetMethod("BuildQuery", BindingFlags.Instance | BindingFlags.NonPublic);
                var chunkStringBuilderObject = buildQueryMethod.Invoke(ctx.PendingRequest, null);
                var chunkStringBuilderType = chunkStringBuilderObject.GetType();
                var createTextReaderMethod = chunkStringBuilderType.GetMethod("CreateTextReader", BindingFlags.Instance | BindingFlags.Public);
                var textReader = createTextReaderMethod.Invoke(chunkStringBuilderObject, null) as TextReader;
                Console.WriteLine(textReader.ReadToEnd());
            };
            var web = ctx.Web;
            ctx.Load(web);
            ctx.ExecuteQuery();
        }
        Console.ReadLine();
    }

}

実行するとこんな感じ。

<Request AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="16.0.0.0" ApplicationName=".NET Library" xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009">
    <Actions>
        <ObjectPath Id="2" ObjectPathId="1" />
        <ObjectPath Id="4" ObjectPathId="3" />
        <Query Id="5" ObjectPathId="3">
            <Query SelectAllProperties="true">
                <Properties />
            </Query>
        </Query>
    </Actions>
    <ObjectPaths>
        <StaticProperty Id="1" TypeId="{3747adcd-a3c3-41b9-bfab-4a64dd2f1e0a}" Name="Current" />
        <Property Id="3" ParentId="1" Name="Web" />
    </ObjectPaths>
</Request>