🕵️♂️
CSOM で実行される Web リクエストを取得する
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