🕵️‍♂️

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

2022/01/01に公開

CSOM では内部的に HTTP リクエストを発行していますが、どういうリクエストが流れているかを見るためには Fiddler などのツールを使う必要があります。しかしれそれではなかなか面倒なので、コードから取得できるようにしてみました。ExecutingWebRequest イベントで取れる e.WebRequestExecutor.GetRequestStream は読み取りができません。なのでリフレクションを使って内部の TextReader を取得しています。

public static class Program
{

    private static void Main(string[] args)
    {
        var url = "{{site-url}}";
        var userName = "{{user-name}}";
        var rawPassword = "{{password}}";
        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>

Discussion