System.Net.WebException the request failed with HTTP status 401: Unauthorized.” Source=”System.Web.Services”


Hi,

I was gettng this error when trying to call the crm’s webservice from my asp.net page

The resolution for this is putting the following code in the web.conig

i.e. enable impersonation and deny anonymous access

<authentication mode=”Windows” />
<identity impersonate=”true”/>
<authorization>
<!–Deny all unauthenticated users–>
<deny users=”?”/>
</authorization
>

Bye

Only the owner of an object can revoke the owner’s access to that object


Hi,

We had written a callout for auto sharing and unsharing of opportunity’s record for postassign event.

On creation of the record we were auto sharing the record with the owner’s manager.

On change of the owner we are first unsharing the record with the owner’s manager and sharing it with new owner’s manager.

While doing this the error we are receiving  is  this

“Only the owner of an object can revoke the owner’s access to that object “

This error is  coming in this particular scenario

say we have a record shared with a particular user say A

now when we are trying to set the new owner as A what the code is trying to do is that,

it is trying to unshare the record with A  this is the point where we receiving this  error!!!

For e.g.

Lead record is owned by User A and is Shared with User A.

Now the Revoke code is running in context of User B and tries to run Revoke for User A who is the owner. We will get this error message.

Bye..

Microsoft Dynamics CRM 3.0 and Microsoft Dynamics CRM 4.0 differences


Multiple organizations can now be hosted and WSDL APIs are now unique per organization.

 

The metadata API service has been extended to retrieve language information.

 

Plug-ins (callouts) and workflow now use the same event framework, allowing for even more extensibility.

 

The SDK has been expanded to include offline access.

 

Now we can programmatically create, read, update and delete the metadata such as entities, attributes and relationship.

 

There are three services instead of two which we used to have in previous version

 

CrmService – http://<crmserver>/mscrmservices/2007/crmservice.asmx

MetadataService – http://<crmserver>/mscrmservices/2007/metadataservice.asmx

DiscoveryService – http://<crmserver>/mscrmservices/2007/ad/crmdiscoveryservice.asmx

 

Previously to write callout we had to reference the follwing assembly

 

Microsoft.Crm.Platform.Callout.Base.dll

 

Instead now we have to reference these assemblies

 

  • Micorsoft.Crm.Sdk.dll
  • Micorsoft.Crm.SdkTypeProxy.dll
  • Micorsoft.Crm.Outlook.Sdk.dll

 

 

Now we can to settings and can then select customizations there we have the option of

Download Web Service Description File.

 

There we can find wsdl files for both CrmService and MetadataService which we can download to our machine and can the simply add web reference to them.

 

 

Previously to access and use the CrmService following lines of code were enough

 

CrmService service=new CrmService();

service.Url=// url for the CrmService

service.Credentials=System.Net.CredentialCache.DefaultCredentials;

 

But now because of the multiple organization support we need to write the following lines of code to identify the organization for which we are writing our custom solution.

 

CrmAuthenticationToken token = new CrmAuthenticationToken();

token.AuthenticationType = 0;

            // 0- Active Directory

            // 1- Microsoft Dynamics CRM Live

            // 2- Internet-Facing deployment (IFD)

token.OrganizationName=“”;// name of the organization

 

CrmService service=new CrmService();

service .Url=// url for the CrmService            service.Credentials=System.Net.CredentialCache.DefaultCredentials;

service.CrmAuthenticationTokenValue = token;

 

 

We have to access the Metadataservice in the similar manner i.e. creating CrmAuthenticationToken and assigning it to CrmMetadataService’s CrmAuthenticationTokenValue.

 

In 3.0 version we could use Metadataservice to access metadata information about any specific entity however in the new version following things are possible

 

  • Creating a customentity.
  • Add or update an attribute for an entity.
  • Create or delete a relationship between two entities.
  • Add or remove an option from a picklist attribute and few others.

 

 

  // CrmDiscoveryService Web service can provide a list of organizations and their corresponding Web service

 // endpoints URL’s. We will use it to configure the CrmService and MetadataService Web service proxies.

           

  CrmDiscoveryService discService = new CrmDiscoveryService();

  discService.UseDefaultCredentials = true;

  discService.Url = http://localhost/MSCRMServices/2007/AD/CrmDiscoveryService.asmx&#8221;;

 

  // Retrieve the list of organization

RetrieveOrganizationsRequest orgRequest = new    RetrieveOrganizationsRequest();

RetrieveOrganizationsResponse orgResponse =(RetrieveOrganizationsResponse) discService.Execute(orgRequest);

 

// Loop through the list to locate the target organization

 

OrganizationDetail orgInfo = null;

foreach (OrganizationDetail orgDetail in orgResponse.OrganizationDetails)

{

if (orgDetail.OrganizationName == “OurOrganizationName”)

    {

          orgInfo = orgDetail;

          break;

    }

}

 

After obtaining the organization details, we can then access the CrmService and MetadataService Web Services to perform our business logic.

 

 

References :

Working with Microsoft Dynamics CRM 4.0 (Microsoft Press)

JavaScript and Microsoft Dynamics CRM


I was thinking that it would have been nice if some expert would have written some article or post about how to use JavaScript within CRM.

And today only i came to know about such an article , it is written by none other than MichaelHohne, the CRM guru, the creator of stunnware site( the most helpful site for Microsoft CRM Developer)

For different things we can do by making use of JavaScript in Microsoft Dynamics CRM,

Plzzzz check and bookmark this url

http://www.stunnware.com/crm2/topic.aspx?id=JS13

Bye

Operation failed due to a SQL integrity violation


Hi,

Today i was suppose to write a callout which would be sending email to owner’s manager for our opportunity entity.

I thought before trying out with an callout(which is really hard to debug) i should try it first in a windows application. Finally after some time i was able to get it working.

So than i decided to put the same code in the callout as well. But to my surprise i found that the same code was not working in the callout.

This was the error i was getting as

ex.detail.innerxml // for (SoapException ex)

<error>
<code>0x80040237</code>
<description>Operation failed due to a SQL integrity violation.</description>
<type>Platform</type>
</error>

After searching on the internet for the same i was able to find the cause for the error in my code

For my windows application this piece of code was sufficient

CrmService service=new CrmService();
service.Credentials=System.Net.CredentialCache.DefaultCredentials;
service.Url=”http://d-2927:5555/mscrmservices/2006/crmservice.asmx&#8221;;

But when it came to callout it had to be

CrmService service=new CrmService();
service.Credentials=System.Net.CredentialCache.DefaultCredentials;
service.Url=”http://d-2927:5555/mscrmservices/2006/crmservice.asmx&#8221;;
service.CallerIdValue = new CallerId();
service.CallerIdValue.CallerGuid =userContext.UserId;

This helped me to solve the error.

Check this link as well

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1768766&SiteID=1

Bye

Using Dhtml inside CRM


Hi,

We can make use of Dhtml inside our CRM onLoad, onSave and onChange javascripts.

Using Dhtml, number of possible ways of customizing CRM increases.

But the only thing with them is that they are unsupported.

Just for fun try putting this code in form load of your contact form and see what it does.

window.status=”Hello CrmUser!”;
window.resizeTo(600,600);
function G_GlowField()
{
event.srcElement.runtimeStyle.backgroundColor=”Yellow”;
var p=window.createPopup()
var pbody=p.document.body
pbody.style.backgroundColor=”lime”
pbody.style.border=”solid black 1px”
pbody.innerHTML=”Mandatory Field”
p.show(150,150,200,50,document.body)

}
function G_RevertField()
{
event.srcElement.runtimeStyle.backgroundColor=””;
}
crmForm.all.firstname.attachEvent(“onmouseover”,G_GlowField);
crmForm.all.firstname.attachEvent(“onmouseout”,G_RevertField);
crmForm.all.firstname.attachEvent(“onmousedown”,G_RevertField);

Or Better check this link

Using the attachEvent method to show users context sensitive help

Bye