How to Invoke WebAPI using PowerShell - SharePoint 2013


Sathish Nadarajan
SharePoint MVP
Published On :   29 Feb 2016
Visit Count
Today :  2    Total :   4820



I came across an interesting workaround to improve the performance of some search and webapi calls to one of our customer.

Let me explain the scenario in detail. I have a WebAPI which does the Search based on certain input parameters. This took some expensive timelines to complete the request and response. Hence, we thought of keeping all the possible inputs and the search results in a Cache.

i.e., coming up with a WarmUp WebAPI Method, which will do all the possible searches and keeps the search results in Cache Objects appropriately. So that, when the actual request comes, it will look in the cache array.

Now, the question is, how to call this WamUp method periodically, i.e., for every two hours. For that, I have come across a PowerShell Script, which will invoke the WebAPI.

 cls
 #Base url
 $urlPrefix = "http://Site/WebAPI/";
 #Endpoints
 $endpoints = @(
 #"api/Search/MyAPIMethod/Param1/Param2?callback=?", 
  "api/search/Method2?callback=?"
 );
 
 $headers = @{"Client-Token"="my-app-client-secret-token"};
 
 function Log([string] $url, $exception){
     #Create EventLog source if it doesn't exist
     $eventSource = "MyApp Job";
     if (![System.Diagnostics.EventLog]::SourceExists($eventSource)){
         New-Eventlog -LogName "Application" -Source $eventSource;
     }
 
     #Write warning to EventLog
     $message = "Call failed URL: " + $url + " Details: " + $exception;
     Write-EventLog -LogName "Application"`
      -Source $eventSource -EventId 1 -EntryType Warning -Message $message;
 }
 
 #Call each endpoint 
 foreach ($endpoint in $endpoints) {
     Write-Output -InputObject $endpoint;
 
     try {
         $response = Invoke-RestMethod -Uri ($urlPrefix + $endpoint)`
          -method GET -ContentType "application/json" -Headers $headers;
         Write-Output -InputObject $response;
     }
     catch {
         Write-Output -InputObject $_.Exception.Response.StatusCode.Value__;
         Log -url ($urlPrefix + $endpoint) -exception $_.Exception.Message;      
     }
 }
 

Now, this PS1 can be called from a BAT and that BAT will be scheduled in the Task Scheduler.

Happy Coding,

Sathish Nadarajan.

Categories