<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Janne Mattila's blog : Microsoft CRM</title><link>http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx</link><description>Tags: Microsoft CRM</description><dc:language>en-US</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Use LINQ to access CRM objects</title><link>http://blogs.msdn.com/jannemattila/archive/2008/08/29/use-linq-to-access-crm-objects.aspx</link><pubDate>Fri, 29 Aug 2008 15:43:07 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8904857</guid><dc:creator>jannemattila</dc:creator><slash:comments>5</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/8904857.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=8904857</wfw:commentRss><description>&lt;p&gt;&lt;/p&gt;  &lt;p&gt;If you have written small console application to check some data from CRM database you have probably already read this article from MSDN: &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/cc151204.aspx"&gt;Use Filtered Views&lt;/a&gt;. That is okay but honestly I’m currently more into LINQ solution. I’ll show you what I mean...&lt;/p&gt;  &lt;p&gt;First I'll create new Console Application project and &lt;em&gt;Add New Item&lt;/em&gt; to it and select &lt;em&gt;LINQ to SQL Classes&lt;/em&gt; and name it &lt;em&gt;CRMDataClasses.dbml&lt;/em&gt;:     &lt;br /&gt;&lt;img title="LINQDataClasses" border="0" alt="LINQDataClasses" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRMandLINQ_C741/LINQDataClasses_3.png" width="544" height="304" /&gt; &lt;/p&gt;  &lt;p&gt;Then I'll use &lt;em&gt;Server Explorer&lt;/em&gt; to connect to CRM database:     &lt;br /&gt;&lt;img title="ServerExplorer" border="0" alt="ServerExplorer" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRMandLINQ_C741/ServerExplorer_3.png" width="254" height="164" /&gt;&lt;/p&gt;  &lt;p&gt;And then I'll drag &lt;em&gt;Account, Contact, FilteredAccount &lt;/em&gt;and &lt;em&gt;FilteredContact&lt;/em&gt; to the canvas of our newly created &lt;em&gt;CRMDataClasses.dbml: &lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRMandLINQ_C741/CRMDataClasses_5.png"&gt;&lt;img title="CRMDataClasses" border="0" alt="CRMDataClasses" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRMandLINQ_C741/CRMDataClasses_thumb_1.png" width="700" height="264" /&gt;&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Now I'm ready to use LINQ to these views:    &lt;br /&gt;    &lt;table cellspacing="10"&gt;&lt;tbody&gt;       &lt;tr&gt;         &lt;td valign="top" align="right"&gt;           &lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22&lt;/font&gt;&lt;/pre&gt;
        &lt;/td&gt;

        &lt;td valign="top"&gt;
          &lt;pre&gt;&lt;font color="#2b91af"&gt;CRMDataClassesDataContext&lt;/font&gt; dataContext = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;CRMDataClassesDataContext&lt;/font&gt;();

&lt;font color="#0000ff"&gt;var&lt;/font&gt; queryContact = &lt;font color="#0000ff"&gt;from&lt;/font&gt; contact &lt;font color="#0000ff"&gt;in&lt;/font&gt; dataContext.Contacts
          &lt;font color="#0000ff"&gt;where&lt;/font&gt; contact.MobilePhone.Length &amp;gt; 0 &amp;amp;&amp;amp;
          contact.LastName.Length &amp;gt; 0
    &lt;font color="#0000ff"&gt;select&lt;/font&gt; contact;

&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#a31515"&gt;&amp;quot;Contact(s):&amp;quot;&lt;/font&gt;);
&lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;Contact&lt;/font&gt; c &lt;font color="#0000ff"&gt;in&lt;/font&gt; queryContact)
{
  &lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(c.FirstName + &lt;font color="#a31515"&gt;&amp;quot; &amp;quot;&lt;/font&gt; + c.LastName + &lt;font color="#a31515"&gt;&amp;quot;, &amp;quot;&lt;/font&gt; + c.MobilePhone);
}

&lt;font color="#0000ff"&gt;var&lt;/font&gt; queryFilteredContact = &lt;font color="#0000ff"&gt;from&lt;/font&gt; contact &lt;font color="#0000ff"&gt;in&lt;/font&gt; dataContext.FilteredContacts
          &lt;font color="#0000ff"&gt;select&lt;/font&gt; contact;
&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#a31515"&gt;&amp;quot;&amp;quot;&lt;/font&gt;);

&lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(&lt;font color="#a31515"&gt;&amp;quot;Filtered contact(s):&amp;quot;&lt;/font&gt;);
&lt;font color="#0000ff"&gt;foreach&lt;/font&gt; (&lt;font color="#2b91af"&gt;FilteredContact&lt;/font&gt; c &lt;font color="#0000ff"&gt;in&lt;/font&gt; queryFilteredContact)
{
  &lt;font color="#2b91af"&gt;Console&lt;/font&gt;.WriteLine(c.lastname);
}&lt;/pre&gt;
        &lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;&lt;/table&gt;
&lt;/p&gt;

&lt;p&gt;On lines 3 to 6 I queried all contacts that have lastname and mobilephone filled in. On lines 14 to 15 I'm querying all contacts where current user has access to. &lt;strong&gt;NOTE: It doesn't return anything if you use SQL Authentication!&lt;/strong&gt; So both of these can be used to fill you applications needs. But do notice that for some reason the attributes at the &lt;em&gt;FilteredContacts&lt;/em&gt; are all lower case and in &lt;em&gt;Contacts&lt;/em&gt; their naming is a bit different. So if you plan to change from &lt;em&gt;Contacts &lt;/em&gt;to &lt;em&gt;FilteredContact&lt;/em&gt; your going to have to change the casing of the attributes little bit.&lt;/p&gt;

&lt;p&gt;This was just quick advice how you can leverage LINQ to your CRM solutions.
  &lt;br /&gt;

  &lt;br /&gt;Anyways... Happy hacking!

  &lt;br /&gt;

  &lt;br /&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8904857" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>Adding CRM 4.0 to your own win app with web form authentication</title><link>http://blogs.msdn.com/jannemattila/archive/2008/05/26/adding-crm-4-0-to-your-own-win-app-with-web-form-authentication.aspx</link><pubDate>Mon, 26 May 2008 09:15:49 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8551960</guid><dc:creator>jannemattila</dc:creator><slash:comments>1</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/8551960.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=8551960</wfw:commentRss><description>&lt;p&gt;Last year I wrote small article &lt;a href="http://blogs.msdn.com/jannemattila/archive/2007/09/25/adding-ms-crm-to-your-own-windows-forms-applications.aspx" target="_blank"&gt;Adding MS CRM to your own windows forms applications&lt;/a&gt; that demonstrates the usage of CRM in your own custom windows forms applications. In CRM 4.0 the story is pretty much the same but there’re few things that you need to take into account so that everything works as you expect. One thing is multi-tenancy and another one is different authentication mechanisms. CRM 4.0 introduces new authentication mechanism called Service Provider License Agreement / SPLA / IFD / Internet Facing Deployment (it has sooo many names :-). Basicly it just means that you login to CRM using web form so it isn’t anything fancier. And that authentication is of course cookie based so if you use Fiddler you’ll see something like this (Note: image is clipped):&lt;/p&gt; &lt;p&gt;&lt;img border="0" alt="CRMCookie" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Add.0toyourownwinappwithwebformauthentic_6429/CRMCookie_0e5cfaaf-10d3-46e3-be26-73dba2a6c877.jpg" width="344" height="105"&gt; &lt;/p&gt; &lt;p&gt;So there is &lt;em&gt;MSCRMSession&lt;/em&gt; ticket that authenticates the user to the system. Okay fine… but what if I want to spawn CRM session whenever I like and still provide “&lt;em&gt;auto login” &lt;/em&gt;for my end users (and of course you’re not using windows authentication a.k.a. On Premise authentication)? Let’s first use Fiddler to determine what’s happening under covers in IFD (and compare it to win auth):&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Add.0toyourownwinappwithwebformauthentic_6429/IFD_2.jpg" target="_blank"&gt;&lt;img border="0" alt="IFD" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Add.0toyourownwinappwithwebformauthentic_6429/IFD_thumb.jpg" width="700" height="252"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Here’s screenshot of Fiddler when user logs on (see highlighted username and password). So the login is just normal HTTP POST. &lt;/p&gt; &lt;p&gt;If we compare that to win auth then we’ll see that there’s that normal &lt;em&gt;authorization&lt;/em&gt; headers that makes the magic happen:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Add.0toyourownwinappwithwebformauthentic_6429/WinAuth_2.jpg" target="_blank"&gt;&lt;img border="0" alt="WinAuth" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Add.0toyourownwinappwithwebformauthentic_6429/WinAuth_thumb.jpg" width="700" height="230"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;You have probably noticed the other difference... which is status code 401. In win auth the system returns 401 which starts the authentication routine. In IFD you’ll save time because you don’t do those 401 round-trips.&lt;/p&gt; &lt;p&gt;But okay.. now we need to achieve “&lt;em&gt;auto login"&lt;/em&gt; and for that we’ll need little bit of code. Example code has been taken from &lt;a href="http://support.microsoft.com/kb/174923" target="_blank"&gt;How To Use the PostData Parameter in WebBrowser Control&lt;/a&gt; and it has been modified for this case. And here we go:&lt;/p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#0000ff"&gt;string&lt;/font&gt; signInUrl = &lt;font color="#a31515"&gt;"http://mcs.mycrmserver.local/signin.aspx?targeturl="&lt;/font&gt;;
&lt;font color="#0000ff"&gt;string&lt;/font&gt; destinationUrl = &lt;font color="#2b91af"&gt;HttpUtility&lt;/font&gt;.UrlEncode(&lt;font color="#a31515"&gt;"http://mcs.mycrmserver.local/loader.aspx"&lt;/font&gt;);
&lt;font color="#0000ff"&gt;using&lt;/font&gt; (&lt;font color="#2b91af"&gt;WebBrowser&lt;/font&gt; browser = &lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;WebBrowser&lt;/font&gt;())
{
  &lt;font color="#0000ff"&gt;string&lt;/font&gt; postData = &lt;font color="#a31515"&gt;"txtUserName="&lt;/font&gt; + username + &lt;font color="#a31515"&gt;"&amp;amp;txtPassword="&lt;/font&gt; + password;
  browser.Navigate(
    signInUrl + destinationUrl &lt;font color="#008000"&gt;/* Url */&lt;/font&gt;,
    &lt;font color="#a31515"&gt;"_blank"&lt;/font&gt; &lt;font color="#008000"&gt;/* Target */&lt;/font&gt;,
    &lt;font color="#2b91af"&gt;Encoding&lt;/font&gt;.UTF8.GetBytes(postData) &lt;font color="#008000"&gt;/* Postdata */&lt;/font&gt;,
    &lt;font color="#a31515"&gt;"Content-Type: application/x-www-form-urlencoded"&lt;/font&gt; + &lt;font color="#2b91af"&gt;Environment&lt;/font&gt;.NewLine &lt;font color="#008000"&gt;/* Headers */&lt;/font&gt;);
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;That code clips uses &lt;em&gt;System.Windows.Forms.WebBrowser &lt;/em&gt;component to POST the login information to CRM so that end user won’t notice the logon event at all. In this example the user will be redirected into the main CRM page (as defined at line 2) but you can of course use any page under CRM if you need to.&lt;/p&gt;
&lt;p&gt;Obviously this approach poses some security threats since you need to store username and especially password in memory. But you can make this thing better by storing the confidential values at &lt;em&gt;System.Security.SecureString&lt;/em&gt; (more info can be found in &lt;a href="http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx" target="_blank"&gt;MSDN&lt;/a&gt;). &lt;em&gt;SecureString&lt;/em&gt; is designed for storing confidential text. And of course you should use HTTPS so that you don’t pass on the information plain text. &lt;/p&gt;
&lt;p&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8551960" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>CRM 4.0 (or SharePoint or custom application) and DebugView</title><link>http://blogs.msdn.com/jannemattila/archive/2008/05/07/crm-4-0-or-sharepoint-or-custom-application-and-debugview.aspx</link><pubDate>Wed, 07 May 2008 10:04:03 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:8465208</guid><dc:creator>jannemattila</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/8465208.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=8465208</wfw:commentRss><description>&lt;p&gt;Every now and then I’m find myself trying to solve same issues over and over again :-) That’s why I found myself (again) using &lt;em&gt;DebugView&lt;/em&gt; as my debugging assistant at remote box. If you don’t know what &lt;em&gt;DebugView&lt;/em&gt; is then you should definitely try it out. I’m going to give you few ideas how you could use it at your applications. You can download the &lt;em&gt;DebugView&lt;/em&gt; from &lt;a title="DebugView download" href="http://technet.microsoft.com/en-us/sysinternals/bb896647.aspx" target="_blank"&gt;Technet&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Why do I use &lt;em&gt;DebugView&lt;/em&gt;? Well I want to get debug messages from running system BUT... I don’t want to write to EventLog or to File since it’s totally unnecessary to write all the messages all the time. I just want messages when I’m ready to observe the system. And DebugView is handy tool for that. Here is list of steps how I normally implement that kind of approach:&lt;br&gt;1) Create log class that implements logging/tracing/debugging (this is pretty much just wrapper to few simple method calls) (I recommend making this as singleton)&lt;br&gt;2) Use you log class in your application/solution&lt;br&gt;3) Use &lt;em&gt;DebugView &lt;/em&gt;to follow the trace messages written by your log class&lt;/p&gt; &lt;p&gt;In 1) I mention that I recommend using singleton approach at the log class. This is important especially at the CRM 4.0 where you need to add default trace listener so that you’ll get the trace messages. Here is the code example for that:&lt;/p&gt; &lt;p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Diagnostics;
&lt;font color="#008000"&gt;// ...
&lt;/font&gt;&lt;font color="#2b91af"&gt;Trace&lt;/font&gt;.Listeners.Add(&lt;font color="#0000ff"&gt;new&lt;/font&gt; &lt;font color="#2b91af"&gt;DefaultTraceListener&lt;/font&gt;());&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;After you have added the default listener you can just use this oneliner:&lt;/p&gt;
&lt;p&gt;
&lt;table cellspacing="10"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#2b91af"&gt;Trace&lt;/font&gt;.WriteLine(&lt;font color="#a31515"&gt;"My Trace: "&lt;/font&gt; + message);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;
&lt;p&gt;Now your trace can be seen at the &lt;em&gt;DebugView&lt;/em&gt;:&lt;br&gt;&lt;img border="0" alt="DebugView" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andDebugView_60C3/DebugView_c8bc2cb2-c36a-463a-9b14-168b4e41f642.png" width="470" height="243"&gt;&lt;br&gt;(here is CRM 4.0 where I have menu item that points to custom ASPX page and I’m using “My Trace” to see what’s happening in there)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DebugView&lt;/em&gt; has many built-in functionalities like “Save As” etc. that can help you on your debug/trace efforts. So I recommend that you learn to play around with it.&lt;/p&gt;
&lt;p&gt;I also had the magic word “SharePoint” in my title. That is for the simple reason that this same story applies to SharePoint too. And don’t forget... Since &lt;em&gt;System.Diagnostics.Trace&lt;/em&gt; is implemented at the .NET Framework this story also applies to all other applications which are built on top of that.&lt;/p&gt;
&lt;p&gt;You might also want to read my previous post about tracing: &lt;a title="CRM 4.0, SharePoint and ASP.NET Trace" href="http://blogs.msdn.com/jannemattila/archive/2008/02/23/crm-4-0-sharepoint-and-asp-net-trace.aspx" target="_blank"&gt;CRM 4.0, SharePoint and ASP.NET Trace&lt;/a&gt;.&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=8465208" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Application+Development/default.aspx">Application Development</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+Office+SharePoint+Server+2007/default.aspx">Microsoft Office SharePoint Server 2007</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>CRM 4.0, SharePoint and ASP.NET Trace</title><link>http://blogs.msdn.com/jannemattila/archive/2008/02/23/crm-4-0-sharepoint-and-asp-net-trace.aspx</link><pubDate>Sat, 23 Feb 2008 21:12:25 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7860388</guid><dc:creator>jannemattila</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/7860388.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=7860388</wfw:commentRss><description>&lt;p&gt;Sometimes I tend to forget how much stuff is built into .NET Framework. Framework gives you nice set of features that you can use without writing a single line of code. ASP.NET Trace is one of them. I know that it's nothing new but I think that it's still used mainly in custom ASP.NET applications. But if you work with products like CRM or SharePoint... you kind of forget that those applications are built on top of ASP.NET and you can still benefit from the features that are part of the framework. So let's refresh our memory so that we can use this feature to build better solutions. &lt;/p&gt; &lt;p&gt;See also good post regarding tracing SharePoint in here "&lt;a title="Enabling Page Level Tracing For SharePoint ASPX Forms" href="http://blogs.threewill.com/implementingsharepoint/Lists/Categories/Category.aspx?Name=User%20Interface" target="_blank"&gt;Enabling Page Level Tracing For SharePoint ASPX Forms&lt;/a&gt;".&lt;/p&gt; &lt;p&gt;Okay let's first enable trace at the web.config (same changes apply for CRM and SharePoint):&lt;/p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#0000ff"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#a31515"&gt;xml&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;version&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;"&lt;font color="#0000ff"&gt;1.0&lt;/font&gt;"&lt;font color="#0000ff"&gt;?&amp;gt;
&amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;configuration&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;
 &amp;lt;!--&lt;/font&gt;&lt;font color="#008000"&gt; ... &lt;/font&gt;&lt;font color="#0000ff"&gt;--&amp;gt;
 &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;system.web&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;
  &amp;lt;!--&lt;/font&gt;&lt;font color="#008000"&gt; ... &lt;/font&gt;&lt;font color="#0000ff"&gt;--&amp;gt;
  &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;trace&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;requestLimit&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;"&lt;font color="#0000ff"&gt;100&lt;/font&gt;"&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;enabled&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;"&lt;font color="#0000ff"&gt;true&lt;/font&gt;"&lt;font color="#0000ff"&gt;/&amp;gt;
  &amp;lt;&lt;/font&gt;&lt;font color="#a31515"&gt;compilation&lt;/font&gt;&lt;font color="#0000ff"&gt; &lt;/font&gt;&lt;font color="#ff0000"&gt;debug&lt;/font&gt;&lt;font color="#0000ff"&gt;=&lt;/font&gt;"&lt;font color="#0000ff"&gt;true&lt;/font&gt;"&lt;font color="#0000ff"&gt; /&amp;gt;
  &amp;lt;!--&lt;/font&gt;&lt;font color="#008000"&gt; ... &lt;/font&gt;&lt;font color="#0000ff"&gt;--&amp;gt;
 &amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;system.web&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;
 &amp;lt;!--&lt;/font&gt;&lt;font color="#008000"&gt; ... &lt;/font&gt;&lt;font color="#0000ff"&gt;--&amp;gt;
&amp;lt;/&lt;/font&gt;&lt;font color="#a31515"&gt;configuration&lt;/font&gt;&lt;font color="#0000ff"&gt;&amp;gt;&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;So in order to enable the trace you just have to make sure that you have trace (line 6) and debug enabled (line 7). After that you're good to go and trace your application.&lt;/p&gt;
&lt;p&gt;I just retrieved front page from my SharePoint (&lt;em&gt;http://demo1&lt;/em&gt;) and then clicked url to custom application page. Then I typed in the trace url &lt;em&gt;http://demo1/Trace.axd&lt;/em&gt; and checkout the results:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/SPSTrace1_2.png" target="_blank"&gt;&lt;img height="442" alt="SharePoint trace" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/SPSTrace1_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And in more detailed (I just clicked the &lt;em&gt;Pages/Default.aspx&lt;/em&gt;):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/SPSTrace2_2.png" target="_blank"&gt;&lt;img height="671" alt="SharePoint trace detailed" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/SPSTrace2_thumb.png" width="650" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And same thing works with CRM 4.0 too... but remember that it's &lt;strong&gt;unsupported&lt;em&gt; &lt;/em&gt;to modify web.config in CRM&lt;/strong&gt; so create back up copy so that you can restore the original file when you need to clean up your modifications.&lt;/p&gt;
&lt;p&gt;In my CRM I opened url &lt;em&gt;http://crmserver/Contoso&lt;/em&gt; to goto tenant named &lt;em&gt;Contoso.&lt;/em&gt; After that I used my custom aspx page from &lt;em&gt;ISV&lt;/em&gt;-folder. And then I checked the trace:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/CRMTrace1_2.png" target="_blank"&gt;&lt;img height="301" alt="CRM Trace" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/CRMTrace1_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And if you look at more detailed view of the trace:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/CRMTrace2_2.png" target="_blank"&gt;&lt;img height="430" alt="CRM Trace details" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/TracingCRM4.0orSharePoint_A9F6/CRMTrace2_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;And you can easily see the amount of stuff that is put into the application state and especially for &lt;em&gt;CRMWindowInfo_CacheKey&lt;/em&gt;. Using this technique you can find e.g performance issues in your code quite easily.&lt;/p&gt;
&lt;p&gt;I actually used this method to debug some AJAX and web services issues and it worked really well because I could check out from the trace what has happened and when. &lt;/p&gt;
&lt;p&gt;To summarize.... you should refresh your memory about things that you get straight from the platform. It can save lot of your time. At least it happened to me :-)&lt;br&gt;&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7860388" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+Office+SharePoint+Server+2007/default.aspx">Microsoft Office SharePoint Server 2007</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>Comparing two databases (schema and/or data)</title><link>http://blogs.msdn.com/jannemattila/archive/2008/02/13/comparing-two-databases-schema-and-or-data.aspx</link><pubDate>Wed, 13 Feb 2008 22:28:30 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7679505</guid><dc:creator>jannemattila</dc:creator><slash:comments>3</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/7679505.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=7679505</wfw:commentRss><description>&lt;p&gt;Quite often people like to know what's happening under the covers when they do something through user interface. For example they use CRM, SharePoint or some other product through user interface and they would like to know what has happened at the database. Normally my answer is that you don't need to know that because "&lt;em&gt;Don't touch the database rule still applies&lt;/em&gt;" but this time I have different answer :-) &lt;/p&gt; &lt;p&gt;I'll shortly explain how can you check that stuff yourself using Visual Studio 2008 and &lt;em&gt;Schema compare&lt;/em&gt; and/or &lt;em&gt;Data compare&lt;/em&gt; functionalities. But it's important to understand that this kind of approach shouldn't be ever executed against production databases. So you really need to have separate dev environment (and databases) for this kind of testing.&lt;/p&gt; &lt;p&gt;Now we're ready to go. I'll use Microsoft CRM 4.0 in my example. I have created two tenants and named them &lt;em&gt;Demo&lt;/em&gt; and &lt;em&gt;DemoEmpty&lt;/em&gt;. And that of course means that I have databases &lt;em&gt;Demo_MSCRM&lt;/em&gt; and &lt;em&gt;DemoEmpty_MSCRM&lt;/em&gt; at my SQL Server. If I now start up my Visual Studio 2008 and connect those two databases to the server explorer and start playing around with this (&lt;em&gt;Data -&amp;gt; Schema Compare -&amp;gt; New Schema Comparison...&lt;/em&gt;):&lt;/p&gt; &lt;p&gt;&lt;img height="209" alt="VSMenuSchemaCompare" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare_b26b5932-3e44-4471-99ce-8254b0dd4146.png" width="617" border="0"&gt; &lt;/p&gt; &lt;p&gt;Then I get this dialog and select those two databases (&lt;strong&gt;NOTE&lt;em&gt;: &lt;/em&gt;Right hand side is the target database!&lt;/strong&gt;):&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare2_2.png" target="_blank"&gt;&lt;img height="291" alt="VSMenuSchemaCompare2" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare2_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And when I click the &lt;em&gt;OK&lt;/em&gt;-button the Visual Studio starts crawling the two databases and then creates list of differences:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare3_2.png" target="_blank"&gt;&lt;img height="148" alt="VSMenuSchemaCompare3" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare3_thumb.png" width="640" border="0"&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Currently we're not yet interested at the differences since we just want to make the databases equal. So I just pressed &lt;em&gt;Write updates&lt;/em&gt; button from the toolbar to make the &lt;em&gt;DemoEmpty_MSCRM&lt;/em&gt; same as the &lt;em&gt;Demo_MSCRM &lt;/em&gt;(remember &lt;em&gt;DemoEmpty&lt;/em&gt; was the target database). Obviously this makes my &lt;em&gt;DemoEmpty&lt;/em&gt; database useless but I use it only to track changes at the &lt;em&gt;Demo&lt;/em&gt; database. &lt;/p&gt; &lt;p&gt;I also used &lt;em&gt;Data Compare -&amp;gt; New Data Comparison...&lt;/em&gt; so that both databases would then have same content (of course you can achieve this same with backup/restore but it's not as fun as this approach!):&lt;/p&gt; &lt;p&gt;&lt;img height="149" alt="VSDataComparepng" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSDataComparepng_dd13296d-c796-4bda-8c93-255a1a3205fe.png" width="400" border="0"&gt; &lt;/p&gt; &lt;p&gt;Now if I refresh the &lt;em&gt;Schema compare&lt;/em&gt; we'll get this view:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSSchemaCompare_2.png" target="_blank"&gt;&lt;img height="366" alt="VSSchemaCompare" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSSchemaCompare_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Or closer view of the &lt;em&gt;schema compare&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare4_3.png" target="_blank"&gt;&lt;img height="399" alt="VSMenuSchemaCompare4" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSMenuSchemaCompare4_thumb.png" width="640" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;We can easily see that our database schemas are equal since the &lt;em&gt;Status &lt;/em&gt;is &lt;em&gt;Equal &lt;/em&gt;for the tables and &lt;em&gt;Update Action &lt;/em&gt;is set to &lt;em&gt;Skip&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;And now we're finally ready to go to the user interface for the tenant &lt;em&gt;Demo&lt;/em&gt; and make some changes. I'll type &lt;em&gt;&lt;u&gt;http://crmserver/Demo&lt;/u&gt;&lt;/em&gt; into my browser and go to the &lt;em&gt;Settings &lt;/em&gt;and &lt;em&gt;Customization -&amp;gt; Customize Entities&lt;/em&gt;. And I'll just add new custom entity called &lt;em&gt;MyDemo&lt;/em&gt; (how original name!) and it makes my entity name &lt;em&gt;new_demo&lt;/em&gt; (since I didn't even change the default prefix... and this is just lazyness I know!):&lt;/p&gt; &lt;p&gt;&lt;img height="246" alt="CRMMyDemoEntity" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/CRMMyDemoEntity_8fa9bd37-68a2-45f7-86d3-0aac435aa6c0.png" width="670" border="0"&gt; &lt;/p&gt; &lt;p&gt;After I have saved my new entity I'm ready to re-run the &lt;em&gt;Schema compare&lt;/em&gt;:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSNewEntitySchemaChange_2.png" target="_blank"&gt;&lt;img height="590" alt="VSNewEntitySchemaChange" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/Comparingdatabaseschemaandordata_B87C/VSNewEntitySchemaChange_thumb.png" width="679" border="0"&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;And of course the changes we're something that you could expect... two new tables called &lt;em&gt;New_demoBase&lt;/em&gt; and &lt;em&gt;New_demoExtensionBase&lt;/em&gt;. If you look at the definitions:&lt;/p&gt; &lt;p&gt;&lt;em&gt;New_demoBase&lt;/em&gt;:&lt;/p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#008000"&gt;-- Columns
&lt;/font&gt;&lt;font color="#0000ff"&gt;CREATE TABLE &lt;/font&gt;[dbo].[New_demoBase]
(
[New_demoId] [uniqueidentifier] &lt;font color="#0000ff"&gt;NOT NULL&lt;/font&gt;,
[CreatedOn] [datetime] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[CreatedBy] [uniqueidentifier] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[ModifiedOn] [datetime] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[ModifiedBy] [uniqueidentifier] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[OwningUser] [uniqueidentifier] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[OwningBusinessUnit] [uniqueidentifier] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[statecode] [int] &lt;font color="#0000ff"&gt;NOT NULL&lt;/font&gt;,
[statuscode] [int] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[DeletionStateCode] [int] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[VersionNumber] [timestamp] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[ImportSequenceNumber] [int] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[OverriddenCreatedOn] [datetime] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[TimeZoneRuleVersionNumber] [int] &lt;font color="#0000ff"&gt;NULL&lt;/font&gt;,
[UTCConversionTimeZoneCode] [int] &lt;font color="#0000ff"&gt;NULL
&lt;/font&gt;) &lt;font color="#0000ff"&gt;ON &lt;/font&gt;[PRIMARY]
&lt;font color="#008000"&gt;-- ...&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;em&gt;New_demoExtensionBase&lt;/em&gt;:&lt;/p&gt;
&lt;table cellspacing="10"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#008000"&gt;-- Columns
&lt;/font&gt;&lt;font color="#0000ff"&gt;CREATE TABLE &lt;/font&gt;[dbo].[New_demoExtensionBase]
(
[New_demoId] [uniqueidentifier] &lt;font color="#0000ff"&gt;NOT NULL&lt;/font&gt;,
[New_name] [nvarchar] (100) &lt;font color="#0000ff"&gt;COLLATE &lt;/font&gt;Latin1_General_CI_AI &lt;font color="#0000ff"&gt;NULL
&lt;/font&gt;) &lt;font color="#0000ff"&gt;ON &lt;/font&gt;[PRIMARY]&lt;br&gt;&lt;font color="#008000"&gt;-- ...&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You'll understand that actually only those base CRM columns are at the &lt;em&gt;New_demoBase&lt;/em&gt; table and all the other (1 in my case since I was lazy and didn't add more fields :-) fields are at the &lt;em&gt;New_demoExtensionBase&lt;/em&gt; table. Of course there are other important changes too like the two new views: &lt;em&gt;FilteredNew_demo&lt;/em&gt; and &lt;em&gt;New_demo&lt;/em&gt;. &lt;em&gt;FilteredNew_demo &lt;/em&gt;is view that uses the users rights to retrieve data... so it automatically filters out all the rows that user doesn't have access to (that's why it's called &lt;em&gt;Filtered&lt;/em&gt; :-). And the other view just combines the two tables (&lt;em&gt;Base&lt;/em&gt; + &lt;em&gt;ExtensionBase&lt;/em&gt;) together.&lt;/p&gt;
&lt;p&gt;But this was just small example how you could compare databases and see what is happening at your application. Remember to use this compare tool carefully... because you could easily make you target database useless... so it would be wise to create backup before playing around with it.&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7679505" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Visual+Studio/default.aspx">Visual Studio</category></item><item><title>Few development tips for CRM 4.0</title><link>http://blogs.msdn.com/jannemattila/archive/2008/01/21/few-development-tips-for-crm-4-0.aspx</link><pubDate>Mon, 21 Jan 2008 11:57:11 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7181665</guid><dc:creator>jannemattila</dc:creator><slash:comments>19</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/7181665.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=7181665</wfw:commentRss><description>&lt;p&gt;If you are working with Microsoft Dynamics CRM 4.0 and your planning to do &lt;em&gt;code customizations&lt;/em&gt; then you probably should keep on reading. And why am I talking about &lt;em&gt;code customizations&lt;/em&gt; and not just &lt;em&gt;customizations&lt;/em&gt;? Well just because in CRM you can do a lot without a single line of code... and this time I want especially to talk about the &lt;em&gt;code customizations&lt;/em&gt;.&lt;/p&gt; &lt;p&gt;I have few topics on my mind that aren't related in anyway but I'm going to sum up them into this post:&lt;/p&gt; &lt;p&gt;1) Custom ASPX pages =&amp;gt; Weird VirtualPathProvider error&lt;/p&gt; &lt;p&gt;2) RetrieveMultipleRequest and DynamicEntities&lt;/p&gt; &lt;p&gt;3) Microsoft.Crm.Sdk.Query.ConditionOperator vs. ConditionOperator through Web Service&lt;/p&gt; &lt;p&gt;4) Using your own Web.config to store settings&lt;/p&gt; &lt;p&gt;Okay here we go!&lt;br&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;Custom ASPX Pages =&amp;gt; Weird VirtualPathProvider error&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;First of all... If you want to create your own custom ASPX pages, then THE location for the files is the ISV folder (any other place would be unsupported):&lt;/p&gt; &lt;p&gt;&lt;img height="541" alt="ISV-Folder" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/ISV-Folder_03704fc5-e77d-4bef-a7d6-ee2411767529.png" width="298" border="0"&gt;&lt;/p&gt; &lt;p&gt;I personally prefer adding my own ASPX pages to another folder (i.e. &lt;em&gt;C:\MyApp\Pages&lt;/em&gt;) and just create virtual folder under IIS ISV-folder. And all your DLLs should go to GAC. I used the &lt;em&gt;_should_&lt;/em&gt; word just because during development time you might want to copy your DLLs to &lt;em&gt;bin&lt;/em&gt; folder directly. It makes life a lot easier (and faster!) because you can just drop them over and you don't have to do any IISRESET in order to test your chances. &lt;strong&gt;BUT&lt;/strong&gt; at the production that is definitely no-go approach. &lt;/p&gt; &lt;p&gt;So you have created you nice &lt;em&gt;Page.aspx&lt;/em&gt; and everything should be fine... but you get pretty interesting exception:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/VirtualPathProvider_2.png"&gt;&lt;img height="444" alt="VirtualPathProvider" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/VirtualPathProvider_thumb.png" width="669" border="0"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;em&gt;The VirtualPathProvider returned a VirtualFile object with VirtualPath set to '/CRM/ISV/Page.aspx' instead of the expected '//CRM/ISV/Page.aspx'. &lt;/em&gt;&lt;/p&gt; &lt;p&gt;You most likely start blaming CRM for that error... but your wrong :-) This exception happens if you have compilation errors in your file. That can happen easily if you have i.e. typo inside your .aspx file. But that error message doesn't help you much when your trying to sort it out. So open up your &lt;em&gt;Page.aspx&lt;/em&gt; and start fixing the error using regular debugging methods (like narrowing down the code to get the location that causes the error).&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;u&gt;RetrieveMultipleRequest and DynamicEntities&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;If you have added some new entities and you used following code to retrieve them:&lt;/p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; Microsoft.Crm.Sdk;
&lt;font color="#0000ff"&gt;using&lt;/font&gt; Microsoft.Crm.SdkTypeProxy;

&lt;font color="#008000"&gt;// ...
&lt;/font&gt;Microsoft.Crm.SdkTypeProxy.&lt;font color="#2b91af"&gt;CrmService&lt;/font&gt; service = 
  &lt;font color="#0000ff"&gt;new&lt;/font&gt; Microsoft.Crm.SdkTypeProxy.&lt;font color="#2b91af"&gt;CrmService&lt;/font&gt;();
service.CrmAuthenticationTokenValue = token;
service.Credentials = System.Net.&lt;font color="#2b91af"&gt;CredentialCache&lt;/font&gt;.DefaultCredentials;
service.UnsafeAuthenticatedConnectionSharing = &lt;font color="#0000ff"&gt;true&lt;/font&gt;;

Microsoft.Crm.Sdk.Query.&lt;font color="#2b91af"&gt;QueryExpression&lt;/font&gt; queryExpression = 
  &lt;font color="#0000ff"&gt;new&lt;/font&gt; Microsoft.Crm.Sdk.Query.&lt;font color="#2b91af"&gt;QueryExpression&lt;/font&gt;();
queryExpression.EntityName = &lt;font color="#a31515"&gt;"mcs_mycustomentity"&lt;/font&gt;;
queryExpression.ColumnSet = &lt;font color="#0000ff"&gt;new&lt;/font&gt; Microsoft.Crm.Sdk.Query.&lt;font color="#2b91af"&gt;AllColumns&lt;/font&gt;();

Microsoft.Crm.SdkTypeProxy.&lt;font color="#2b91af"&gt;RetrieveMultipleRequest&lt;/font&gt; request = 
  &lt;font color="#0000ff"&gt;new&lt;/font&gt; Microsoft.Crm.SdkTypeProxy.&lt;font color="#2b91af"&gt;RetrieveMultipleRequest&lt;/font&gt;();
request.Query = queryExpression;
service.Execute(request);&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;You'll probably hit this on the line 19: &lt;/p&gt;
&lt;p&gt;&lt;img height="328" alt="DynamicEntity" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/DynamicEntity_76a8a214-7421-4601-83c7-39f9af832565.png" width="667" border="0"&gt;&lt;/p&gt;
&lt;p&gt;And it's pretty obvious that the error message... &lt;/p&gt;
&lt;p&gt;&lt;em&gt;Exception: System.InvalidOperationException: There is an error in XML document (1, 503). ---&amp;gt; *&lt;br&gt;System.InvalidOperationException: The specified type was not recognized: name='mcs_mycustomentity'&lt;/em&gt; 
&lt;p&gt;...doesn't help you that much :-) Okay now we need to start debugging and sort this thing out. First I'll take use try &lt;a title="Fiddler" href="http://www.fiddlertool.com" target="_blank"&gt;Fiddler&lt;/a&gt; and see what happens:&lt;/p&gt;
&lt;p&gt;&lt;img height="331" alt="Fiddler" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/Fiddler_c5c625e7-cbab-4f00-9f8a-32f70b869b35.png" width="595" border="0"&gt;&lt;/p&gt;
&lt;p&gt;And if you look carefully enough you see something interesting: &lt;em&gt;ReturnDynamicEntities=false &lt;/em&gt;(marked as red). And of course that rings a bell... your query is trying to return entity that would have been returned as dynamic entity. And if that's not allowed then you get your weird &lt;em&gt;InvalidOperationException&lt;/em&gt;. Luckily that's easy to fix... just add this one line of code:&lt;/p&gt;
&lt;table cellspacing="10"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;request.ReturnDynamicEntities = &lt;font color="#0000ff"&gt;true&lt;/font&gt;;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Put that line of code before &lt;em&gt;Execute&lt;/em&gt; call and you'll be fine. &lt;/p&gt;
&lt;p&gt;Another way would be using directly the Web Reference to retrieve the &lt;em&gt;CrmService&lt;/em&gt;. Then you could use strongly typed classes to implement your queries and you wouldn't have to work with &lt;em&gt;DynamicEntities&lt;/em&gt;. If you can choose this option then I strongly recommend it. But if you need to create code that works with multiple tenants and you need to use entities that doesn't exist in all tenants... then you need to use DynamicEntities.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Microsoft.Crm.Sdk.Query.ConditionOperator vs. ConditionOperator through Web Service&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;If you use &lt;em&gt;Microsoft.Crm.Sdk.Query.ConditionOperator&lt;/em&gt; you have 59 operators (I calculated them by hand so let say ~59 :-) and if you use &lt;em&gt;ConditionOperator&lt;/em&gt; through the web service you have only 48 operators. And if you use one that doesn't exist in both i.e. &lt;em&gt;Microsoft.Crm.Sdk.Query.ConditionOperator&lt;/em&gt;.&lt;em&gt;EndsWith&lt;/em&gt; in your queries you'll get this &lt;em&gt;InvalidOperationException&lt;/em&gt;:&lt;br&gt;&lt;a href="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/ConditionOperator_2.png"&gt;&lt;img height="202" alt="ConditionOperator" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andsomedevelopmenttips_AC9A/ConditionOperator_thumb.png" width="747" border="0"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Like the error message says "&lt;em&gt;InvalidOperationException: Instance validation error: '56' is not a valid value for Microsoft.Crm.Sdk.Query.ConditionOperator&lt;/em&gt;" you can't use those values since they haven't been implemented in the other one. I just wanted to give this hint that you don't scratch your head too much if you get this error :-) And of course you can achieve the same functionality using the other operators so this is NOT limiting factor. For example query for word "&lt;em&gt;searchword&lt;/em&gt;" with operator &lt;em&gt;ConditionOperator.EndsWith&lt;/em&gt; is equal to &lt;em&gt;ConditionOperator.Like&lt;/em&gt; with "%" + "&lt;em&gt;searchword&lt;/em&gt;" :-)&lt;br&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;Using your own Web.config to store settings&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;You probably know that &lt;u&gt;it's strickly forbidden to touch web.config of CRM installation &lt;/u&gt;(file that exists in &lt;em&gt;CRMWeb&lt;/em&gt; folder). So if you need to store some custom stuff in your own web.config you may think that it's piece of cake. So let's say that you put your own web.config into "&lt;em&gt;/ISV/MyApp/"&lt;/em&gt;-folder. If you then use your CRM with the default organization (your url is&amp;nbsp; http://localhost/loader.aspx and not http://localhost/MyOrg/loader.aspx) you can access your web.config appSettings as you would in any ASP.NET application. But if you use it through "the long" url where your organizations name is at the url too... then you probably notice that you can't access the web.config as you would expect. You'll only get empty parameters from your web.config even if your sure that everything is fine. Reason for that is actually pretty simple: VirtualPathProvider. Since CRM 4.0 now supports multiple tenants you don't actually access your tenants from "physical" urls anymore. They are now virtualized so that you can have any number of tenants at your system. But this makes your life a bit harder since you need to "load" your own web.confg in your code. It's not difficult but you just need to know what to do. Here's is small example:&lt;/p&gt;
&lt;table cellspacing="10"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Configuration;
&lt;font color="#0000ff"&gt;using&lt;/font&gt; System.Web.Configuration;

&lt;font color="#008000"&gt;// ...
&lt;/font&gt;&lt;font color="#2b91af"&gt;Configuration&lt;/font&gt; configuration = &lt;font color="#2b91af"&gt;WebConfigurationManager&lt;/font&gt;.OpenWebConfiguration(&lt;font color="#a31515"&gt;"/ISV/MyApp"&lt;/font&gt;);
&lt;font color="#0000ff"&gt;string&lt;/font&gt; myParameter = configuration.AppSettings.Settings[&lt;font color="#a31515"&gt;"MyParameter"&lt;/font&gt;].Value;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;In line 5 you just specify virtual path of your web.config. After that you can use settings normally. &lt;br&gt;&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7181665" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>CRM 4.0 and ISV.config modifications</title><link>http://blogs.msdn.com/jannemattila/archive/2008/01/10/crm-4-0-and-isv-config-modifications.aspx</link><pubDate>Thu, 10 Jan 2008 15:14:52 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:7054861</guid><dc:creator>jannemattila</dc:creator><slash:comments>6</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/7054861.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=7054861</wfw:commentRss><description>&lt;p&gt;If you want to add custom menuitems, modify navbars, add funtionality to toolbars etc. you need to modify so called ISV.config. In CRM 4.0 it can be done pretty easily with these simple steps:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Export current ISV config: Settings -&amp;gt; Customization -&amp;gt; Export Customizations and then select &lt;em&gt;ISV Config&lt;/em&gt; and press &lt;em&gt;Export Selected Customizations&lt;/em&gt;.  &lt;li&gt;Save .zip file and edit .xml file inside it  &lt;li&gt;Import modified file from Settings -&amp;gt; Customization -&amp;gt; Import Customizations  &lt;li&gt;Enjoy your modifications!&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;Actually that same has been presented in really cool Silverlight ScreenCast in &lt;a href="http://blogs.msdn.com/lezamax/archive/2007/10/24/the-first-of-hopefully-many-to-come-titan-features.aspx" target="_blank"&gt;here&lt;/a&gt; (it's really worth checking out!).&lt;/p&gt; &lt;p&gt;BUT... what if your UI customizations aren't showing up in the UI?! Well the reason is actually pretty obvious (when you found out it first :-)... because you need to first enable the customizations from system settings:&lt;/p&gt; &lt;p&gt;&lt;img height="383" alt="CRM System Settings" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andISV.configmodifications_C393/CRMSystemSettings1_3ee9edd7-3770-4eab-9dda-c59fc98b17d0.png" width="407" border="0"&gt; &lt;br&gt;So navigate to Settings -&amp;gt; Administration -&amp;gt; System Settings and you'll get this dialog:&lt;/p&gt; &lt;p&gt;&lt;img height="533" alt="CRM System Settings and customization" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andISV.configmodifications_C393/CRMSystemSettings2_70d4828e-8fb2-438a-8f17-c0370ee720e3.png" width="535" border="0"&gt; &lt;/p&gt; &lt;p&gt;There you can find &lt;em&gt;Custom menus and toolbars&lt;/em&gt; which is by default empty. So in order to support your stuff you need to press the ellipse next to the empty textbox and select the UIs you want to modify:&lt;/p&gt; &lt;p&gt;&lt;img height="322" alt="Selected UIs for the customizations" src="http://blogs.msdn.com/blogfiles/jannemattila/WindowsLiveWriter/CRM4.0andISV.configmodifications_C393/CRMSystemSettings3_111c257c-a048-4ee8-9a94-db61a561b3f9.png" width="516" border="0"&gt; &lt;/p&gt; &lt;p&gt;Now I have selected all the three UIs and I'll just press OK for the two dialogs. And now you should really see your own modifications.&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=7054861" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/tips+and+tricks/default.aspx">tips and tricks</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item><item><title>Adding MS CRM to your own windows forms applications</title><link>http://blogs.msdn.com/jannemattila/archive/2007/09/25/adding-ms-crm-to-your-own-windows-forms-applications.aspx</link><pubDate>Tue, 25 Sep 2007 22:27:17 GMT</pubDate><guid isPermaLink="false">91d46819-8472-40ad-a661-2c78acb4018c:5127385</guid><dc:creator>jannemattila</dc:creator><slash:comments>2</slash:comments><comments>http://blogs.msdn.com/jannemattila/comments/5127385.aspx</comments><wfw:commentRss>http://blogs.msdn.com/jannemattila/commentrss.aspx?PostID=5127385</wfw:commentRss><description>&lt;p&gt;I was asked to create simple demo that demonstrates MS CRM inside custom .NET application. So I created small win app with just couple of controls to make the demo pretty simple.&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:6960CE03-38FC-44df-87D4-FA4540212B06:6fc13bb4-79be-4a86-9660-a65192550a69" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;img src="http://blogs.msdn.com/photos/jannemattila/images/5127065/original.aspx" alt="" style="width:343px; height:161px;" /&gt;&lt;/div&gt; &lt;p&gt;If user presses &lt;em&gt;Edit customer&lt;/em&gt; button then new form is opened and that will host CRM form like this:&lt;/p&gt; &lt;div class="wlWriterSmartContent" id="scid:6960CE03-38FC-44df-87D4-FA4540212B06:84cda2ce-363c-4639-aaac-f50faed47213" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;img src="http://blogs.msdn.com/photos/jannemattila/images/5127094/original.aspx" alt="" style="width:952px; height:379px;" /&gt;&lt;/div&gt; &lt;p&gt;And if user then clicks &lt;em&gt;Save and Close&lt;/em&gt; this newly created form is automatically closed and user is returned to the previous form. &lt;/p&gt; &lt;p&gt;Let's see the code that is used to make this happen. First we need to retrieve entity and get it's unique id. Here is example of that part for the account entity (I used my helper class and ripped also all the other things that aren't mandatory to understand this example):&lt;/p&gt; &lt;table cellspacing="10"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;&lt;font color="#008080"&gt;account&lt;/font&gt; account = crm.GetAccountByField(&lt;font color="#aa2000"&gt;"telephone1"&lt;/font&gt;, texPhoneNumber.Text);
&lt;font color="blue"&gt;if&lt;/font&gt; (account != &lt;font color="blue"&gt;null&lt;/font&gt;)
{
  url = &lt;font color="#aa2000"&gt;"http://danubecrm:5555/sfa/accts/edit.aspx?id={"&lt;/font&gt; + account.accountid.Value.ToString() + &lt;font color="#aa2000"&gt;"}"&lt;/font&gt;;
}
&lt;font color="blue"&gt;&lt;font color="blue"&gt;else&lt;/font&gt;&lt;/font&gt;
{
  &lt;font color="#008080"&gt;MessageBox&lt;/font&gt;.Show(&lt;font color="#aa2000"&gt;"Account not found!"&lt;/font&gt;, &lt;font color="#aa2000"&gt;"Not found"&lt;/font&gt;, MessageBoxButtons.OK, MessageBoxIcon.Error);
}&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;So in line 4 we have URL for editing that specific account. Now we need to way to host in in our form. This part is actually pretty nice and easy since we can use WebBrowser component to make this happen. But now we need to add code to actually notice that has the user already pressed &lt;em&gt;Save and Close&lt;/em&gt; since then we want to close our form. It can be achieved by creating timer that check the URL of the WebBrowser component. We'll just monitor it's value and when it's null we know that user has exited current page. We start the timer when document has been first completed. Here's the code:&lt;/p&gt;
&lt;table cellspacing="10"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" align="right"&gt;&lt;pre&gt;&lt;font color="gray"&gt;1
2
3
4
5
6
7
8
9
10
11
12&lt;/font&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td valign="top"&gt;&lt;pre&gt;    &lt;font color="blue"&gt;private&lt;/font&gt; &lt;font color="blue"&gt;void&lt;/font&gt; browserTimer_Tick(&lt;font color="blue"&gt;object&lt;/font&gt; sender, &lt;font color="#409090"&gt;EventArgs&lt;/font&gt; e)
    {
      &lt;font color="blue"&gt;if&lt;/font&gt; (browser.Url == &lt;font color="blue"&gt;null&lt;/font&gt;)
      {
        &lt;font color="blue"&gt;this&lt;/font&gt;.Close();
      }
    }

    &lt;font color="blue"&gt;private&lt;/font&gt; &lt;font color="blue"&gt;void&lt;/font&gt; browser_DocumentCompleted(&lt;font color="blue"&gt;object&lt;/font&gt; sender, WebBrowserDocumentCompletedEventArgs e)
    {
      browserTimer.Enabled = &lt;font color="blue"&gt;true&lt;/font&gt;;
    }&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;This is simple demonstration how to use CRM inside your application. Of course you could do all that stuff through CRM API but if you want to re-use the form from CRM this could be way to achieve that.&lt;br&gt;&lt;br&gt;Anyways... Happy hacking!&lt;br&gt;&lt;br&gt;J&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=5127385" width="1" height="1"&gt;</description><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Programming/default.aspx">Programming</category><category domain="http://blogs.msdn.com/jannemattila/archive/tags/Microsoft+CRM/default.aspx">Microsoft CRM</category></item></channel></rss>