Sample: Web access from a sandboxed plug-in
Applies To: Dynamics CRM 2013
Requirements
This sample code is for Microsoft Dynamics CRM 2013 and Microsoft Dynamics CRM Online. Download the Microsoft Dynamics CRM SDK package. It can be found in the following location in the download package:
SDK\SampleCode\CS\Plugins\WebClientPlugin.cs
SDK\SampleCode\VB\Plugins\WebClientPlugin.vb
Register the compiled plug-in to run in the sandbox on the Microsoft Dynamics CRM server.
Demonstrates
Demonstrates how to code a plug-in that has Web (network) access and be registered in the sandbox.
Example
using System;
using System.Globalization;
using System.IO;
using System.Text;
using System.Net;
// Microsoft Dynamics CRM namespace(s)
using Microsoft.Xrm.Sdk;
namespace Microsoft.Crm.Sdk.Samples
{
/// <summary>
/// A sandboxed plug-in that can access network (Web) resources.
/// </summary>
/// <remarks>Register this plug-in in the sandbox. You can provide an unsecure string
/// during registration that specifies the Web address (URI) to access from the plug-in.
/// </remarks>
public sealed class WebClientPlugin : IPlugin
{
private string webAddress;
/// <summary>
/// The plug-in constructor.
/// </summary>
/// <param name="config">The Web address to access. An empty or null string
/// defaults to accessing www.bing.com. The Web address can use the HTTP or
/// HTTPS protocol.</param>
public WebClientPlugin(string config)
{
if (String.IsNullOrEmpty(config))
{
webAddress = "https://www.bing.com";
}
else
{
webAddress = config;
}
}
/// <summary>
/// Main execute method that is required by the IPlugin interface. Uses the WebClient
/// .NET class to access the target Web address.
/// </summary>
/// <param name="serviceProvider">The service provider from which you can obtain the
/// tracing service, plug-in execution context, organization service, and more.</param>
public void Execute(IServiceProvider serviceProvider)
{
//Extract the tracing service for use in plug-in debugging.
ITracingService tracingService =
(ITracingService)serviceProvider.GetService(typeof(ITracingService));
try
{
tracingService.Trace("Downloading the target URI: " + webAddress);
try
{
// Download the target URI using a Web client. Any .NET class that uses the
// HTTP or HTTPS protocols and a DNS lookup should work.
using (WebClient client = new WebClient())
{
byte[] responseBytes = client.DownloadData(webAddress);
string response = Encoding.UTF8.GetString(responseBytes);
tracingService.Trace(response);
// For demonstration purposes, throw an exception so that the response
// is shown in the trace dialog of the Microsoft Dynamics CRM user interface.
throw new InvalidPluginExecutionException("WebClientPlugin completed successfully.");
}
}
catch (WebException exception)
{
string str = string.Empty;
if (exception.Response != null)
{
using (StreamReader reader =
new StreamReader(exception.Response.GetResponseStream()))
{
str = reader.ReadToEnd();
}
exception.Response.Close();
}
if (exception.Status == WebExceptionStatus.Timeout)
{
throw new InvalidPluginExecutionException(
"The timeout elapsed while attempting to issue the request.", exception);
}
throw new InvalidPluginExecutionException(String.Format(CultureInfo.InvariantCulture,
"A Web exception occurred while attempting to issue the request. {0}: {1}",
exception.Message, str), exception);
}
}
catch (Exception e)
{
tracingService.Trace("Exception: {0}", e.ToString());
throw;
}
}
}
}
Imports System.Globalization
Imports System.IO
Imports System.Text
Imports System.Net
' Microsoft Dynamics CRM namespace(s)
Imports Microsoft.Xrm.Sdk
Namespace Microsoft.Crm.Sdk.Samples
''' <summary>
''' A sandboxed plug-in that can access network (Web) resources.
''' </summary>
''' <remarks>Register this plug-in in the sandbox. You can provide an unsecure string
''' during registration that specifies the Web address (URI) to access from the plug-in.
''' </remarks>
Public NotInheritable Class WebClientPlugin
Implements IPlugin
Private webAddress As String
''' <summary>
''' The plug-in constructor.
''' </summary>
''' <param name="config">The Web address to access. An empty or null string
''' defaults to accessing www.bing.com. The Web address can use the HTTP or
''' HTTPS protocol.</param>
Public Sub New(ByVal config As String)
If String.IsNullOrEmpty(config) Then
webAddress = "https://www.bing.com"
Else
webAddress = config
End If
End Sub
''' <summary>
''' Main execute method that is required by the IPlugin interface. Uses the WebClient
''' .NET class to access the target Web address.
''' </summary>
''' <param name="serviceProvider">The service provider from which you can obtain the
''' tracing service, plug-in execution context, organization service, and more.</param>
Public Sub Execute(ByVal serviceProvider As IServiceProvider) _
Implements IPlugin.Execute
'Extract the tracing service for use in plug-in debugging.
Dim tracingService As ITracingService =
CType(serviceProvider.GetService(GetType(ITracingService)),
ITracingService)
Try
tracingService.Trace("Downloading the target URI: " & webAddress)
Try
' Download the target URI using a Web client. Any .NET class that uses the
' HTTP or HTTPS protocols and a DNS lookup should work.
Using client As New WebClient()
Dim responseBytes() As Byte = client.DownloadData(webAddress)
Dim response As String = Encoding.UTF8.GetString(responseBytes)
tracingService.Trace(response)
' For demonstration purposes, throw an exception so that the response
' is shown in the trace dialog of the Microsoft Dynamics CRM user interface.
Throw New InvalidPluginExecutionException("WebClientPlugin completed successfully.")
End Using
Catch exception As WebException
Dim str As String = String.Empty
If exception.Response IsNot Nothing Then
Using reader As New StreamReader(exception.Response.GetResponseStream())
str = reader.ReadToEnd()
End Using
exception.Response.Close()
End If
If exception.Status.Equals(WebExceptionStatus.Timeout) Then
Throw New InvalidPluginExecutionException("The timeout elapsed while attempting to issue the request.", exception)
End If
Throw New InvalidPluginExecutionException(String.Format(CultureInfo.InvariantCulture, "A Web exception occurred while attempting to issue the request. {0}: {1}", exception.Message, str), exception)
End Try
Catch e As Exception
tracingService.Trace("Exception: {0}", e.ToString())
Throw
End Try
End Sub
End Class
End Namespace
See Also
IPlugin
ITracingService
Plug-in development
Write a plug-in
Plug-in isolation, trusts, and statistics