Tag Archives: Troubleshooting

jQuery UI und Knockout – “You cannot apply bindings multiple times to the same element”

Um jQuery UI zusammen mit Knockout zu verwenden habe ich ein eigenes Knockout Binding erstellt. In der Init Methode wird das jQuery Widget erstellt.
Beim folgenden Beispiel handelt es sich um TypeScript Code.

ko.bindingHandlers["dialogBox"] = {
	init(element: any, valueAccessor: any) {
		$(element).dialog({
			autoOpen: false,
			modal: true,
                        
			resizable: false,
			// More Code
		});
		return false;
	},
	update(element: any, valueAccessor: any) {
		// Update Code
	}
}

In diesem Beispiel verwende ich den jQuery UI Dialog. Der Content des Dialogs befindet sich in einem Div. Natürlich wurde der Inhalt dieses Divs über ein Knockout-Template erzeugt (“template”-Binding). Mit dieser Methode lässt sich der Code welcher das DOM kennt, auf die Bindings beschränken.

Bei einigen Widgets, darunter auch der Dialog, tritt jedoch der folgende Fehler auf:
“You cannot apply bindings multiple times to the same element.”

Um die Ursache zu verstehen, muss man wissen, dass jQuery UI beim initialisieren bzw. erstellen des Widgets das Div, welches den Content des Dialogs darstellt, ausschneidet, etwas verpackt und ganz unten in der Seite einfügt.

Vorher:

<html>
	<head>
		<!-- jQuery und jQuery UI includen -->
		<script>
			$(function() {
				$( "#dialog" ).dialog();
			});
		</script>
	</head>
	<body>
		<div id="insideMeIsTheDialog">
			<div id="dialog" title="Basic dialog">
				<p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed
					with the 'x' icon.</p>
			</div>
		</div>
	</body>
</html>

Nachher:

<html>
	<head>
		<script>
			$(function() {
				$( "#dialog" ).dialog();
			});
		</script>
	</head>
	<body style="cursor: auto;">
		<div id="insideMeIsTheDialog"></div>
		<div aria-labelledby="ui-id-1" aria-describedby="dialog" role="dialog" tabindex="-1" style="position: absolute; height: 143.6px; width: 299.6px; top: 203px; left: 660px; display: block; right: auto; bottom: auto;" class="ui-dialog ui-widget ui-widget-content ui-corner-all ui-front ui-draggable ui-resizable">
			<div class="ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix ui-draggable-handle">
				<span class="ui-dialog-title" id="ui-id-1">Basic dialog</span>
				<button title="Close" role="button" class="ui-button ui-widget ui-state-default ui-corner-all ui-button-icon-only ui-dialog-titlebar-close"
				type="button">
					<span class="ui-button-icon-primary ui-icon ui-icon-closethick"></span>
					<span class="ui-button-text">Close</span>
				</button>
			</div>
			<div style="width: auto; min-height: 105px; max-height: none; height: auto;" class="ui-dialog-content ui-widget-content" id="dialog">
				<p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
			</div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-n"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-e"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-s"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-w"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-se ui-icon ui-icon-gripsmall-diagonal-se"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-sw"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-ne"></div>
			<div style="z-index: 90;" class="ui-resizable-handle ui-resizable-nw"></div>
		</div>
	</body>

</html>

Ist nun der Knockout Binding Scope der Body oder allgemeiner gesamt, der gemeinsame Parent des Dialog Divs und des “ausgeschnittenen” Dialog Divs, so probiert Knockout die Bindings mehrmals auszuführen.

Die Lösung:
1. Den Scope für das Knockout Binding einschränken
2. jQuery UI das Widget ausserhalb dieses Scopes platzieren lassen

<html>
	<head>
		<script>
			$(function() {
				$( "#dialog" ).dialog({
					appendTo: "#container"
				});
			});
		</script>
	</head>
	<body>
		<div id="container">
			<div id="bindingRoot">
				<div id="dialog" title="Basic dialog">
					<p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed
						with the 'x' icon.</p>
				</div>
			</div>
		</div>
	</body>
</html>

Access is denied beim async Solution Import (ImportSolutionRequest & ExecuteAsyncRequest )

Der Versuch eine Solution “ImportSolutionRequest” mit dem “ExecuteAsyncRequest” zu importieren scheitert mit folgendem Fehler:

“Solution Import Failed: 31 Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Access is denied. Detail: <OrganizationServiceFault xmlns:i=”http://www.w3.org/2001/XMLSchema-instance” xmlns=”http://schemas.microsoft.com/xrm/2011/Contracts”> <ErrorCode>-2147187707</ErrorCode> <ErrorDetails xmlns:d2p1=”http://schemas.datacontract.org/2004/07/System.Coll
ections.Generic” /> <Message>Access is denied.</Message><Timestamp>2014-08-22T12:31:53.4691706Z</Timestamp>”.

Continue reading

Ungültiges Argument / Invalid Argument beim klick auf Role Assign / Rolle zuweisen

Problem:
Beim Versuch einem Form eine Rolle zuzuweisen wird ein Fenster mit der Fehlermeldung “Ungültiges Argument” bzw. “Invalid Argument” angezeigt.
Der Fehler ist unabhängig vom Mandanten und vom Form – er tritt Server weit auf.

Steps to reproduce

Ursache:
Es scheint als ob sich das Setting “TurnOffFetchThrottling” und “Assign Role” beissen, wenn viele Mandanten auf einem Server existieren. Eine genaue Klärung der Ursache bleibt der MS Support, trotz Nachfrage, schuldig.

Lösung:
“TurnOffFetchThrottling” muss ausgeschalten werden.
Das wird über die Registry gemacht. Der Key “TurnOffFetchThrottling” ist unter
“HKEY_LOCAL_MACHINESoftwareMicrosoftMSCRM” zu finden.
“TurnOffFetchThrottling” muss auf “0” gesetzt werden.

Zusätzliche Info:
Wird “TurnOffFetchThrottling” mit einem anderen Wert als “0” in die Registry eingefügt, wird die Einschränkung auf 5000 Records für den Retrieve (ohne Paging) aufgehoben.

FetchXML und Wildcards

In diesem Post geht es um die Interpretation von Wildcards von Dynamics CRM. Um das Problem zu erklären, muss ich etwas ausholen. Die Anforderung war folgende: Ein CRM Dialog soll die Möglichkeit bieten nach Entitäten zu suchen. Die Suche soll mit “Begins With” funktionieren. Gibt der Benutzer für ein Attribut keinen Wert ein, so soll dieses Attribut nicht berücksichtigt werden. Als Filter ist “and” einzusetzen.

Zum bessern Verständnis hier der gewünschte Dialog:
Wildcard_1

Was hat das nun mit FetchXML und Wildcards zu tun? Beim testen fällt folgendes auf:
Wildcard_3

In Worte gefasst: Sobald ein Attribut, dass in die Suche mit einbezogen wird, keinen Wert enthält, wird der Record nicht mehr zurückgeliefert.

Sehen wir uns also die Query an, die abgesetzt wird:
Wildcard_2

Im oben gezeigten Fall, müsste das somit die folgende sein:

<fetch mapping='logical'>
   <entity name='account'>
      <attribute name = 'name'/>
      <attribute name = 'accountid'/>
      <order attribute='name' descending='false' />
      <filter type='and'>
         <condition attribute = 'name' operator='like' value='Stree%'/>
         <condition attribute = 'name' operator='like' value='%'/>
      </filter>
   </entity>
</fetch>

Nach etwas mehr Testing (mit ausführen der FetchExpression über eine Console Application) kam ich zum Schluss:
Der Wildcard Operator “%” steht für “Any Character” aber nicht für “Empty”.

Diese Erkenntnis war sehr ärgerlich, heisst sie doch, dass sich die Anforderung nicht umsetzen lässt. Oder etwas doch? Mit einem Plug-In auf der “RetrieveMultiple” Message müsste sich die Query manipulieren lassen. Und siehe da, es funktioniert. Hier noch der Code für das Plugin.

public class RetrieveMultiple : IPlugin
{
  public void Execute(IServiceProvider serviceProvider)
  {
    var context = (IPluginExecutionContext)serviceProvider.GetService(typeof(IPluginExecutionContext));

    if (context.InputParameters.Contains("Query") &amp;&amp; context.InputParameters["Query"] is FetchExpression)
    {
      var fetchExpression = (FetchExpression)context.InputParameters["Query"];
      var xDocument = XDocument.Parse(fetchExpression.Query);
      xDocument.Descendants("condition").Where(c => c.Attribute("operator").Value == "like" &amp;&amp; c.Attribute("value").Value == "%").Remove();
      fetchExpression.Query = xDocument.ToString(SaveOptions.DisableFormatting);
    }
  }
}

Falscher UniqueName bei Custom Actions in CRM 2013

Die Anforderung scheint relativ einfach:
Eine Custom Action soll dynamisch (natürlich über Code – anders lassen sich Actions gar nicht aufrufen) aufgerufen werden. Mit dynamisch ist hier gemeint, dass der Benutzer den Namen (Displayname) der Action eingibt.

Um eine Action zu triggern muss ein OrganizationRequest mit dem Namen der Action erstellt und ausgeführt werden. Dabei muss der Name dem UniqueName der Action entsprechen.

Die folgenden Bilder zeigen wie eine Action mit dem Displayname “MSSolveTest1” und dem UniqueName “new_MSSolveTest1” angelegt wird.

action bug 1

action bug 2

Nun kann die Action wie folgt getriggert werden:

var actionRequest = new OrganizationRequest("new_MSSolveTest1");
OrganizationServiceContext.Execute(actionRequest);

Um die Applikation gemäss Anforderung umzusetzen muss nun nur der UniqueName der Action (die durch einen Record in der Workflow-Entity repräsentiert wird) über den Displaynamen geholt werden.
Und genau hier gibt es ein Problem.

Das folgende Bild zeigt einen Auszug von Attributen der eben erstellten Action.
Diese wurden über den OData Service geholt.
https://mycrm.com/XRMServices/2011/OrganizationData.svc/WorkflowSet?$filter=Name%20eq%20%27MSSolveTest1%27

action bug 3

Wie hier deutlich zu sehen ist, ist der UniqueName OHNE Solution Präfix gespeichert. Um die Action zu triggern ist jedoch der UniqueName MIT Solution Präfix nötig.

Der Microsoft Support hat bestätigt, dass es sich hierbei um einen Fehler handelt und einen Fix versprochen. Dieser wurde niedrig priorisiert und wird deshalb erst mit der “Fall Wave” (siehe CRM 2013 Roadmap) ausgeliefert.

Workaround:
Das Präfix der Solution bzw. des Publishers der Solution muss manuell geholt werden.
Action -> Solution -> Publisher -> Präfix (Achtung: Befindet sich die Action in der System Solution ist kein Präfix angegeben)

0x80040216 – Expected to find one SdkMessageFilter for SdkMessageId {GUID} PrimaryEntity 10015 and SecondaryEntity 0. Found 0 records.

Wenn du probierst eine CRM Solution mit einer Custom Action, auf der wiederum ein Plugin Step (SdkMessageProcessingStep) registriert ist, im CRM Online zu importieren erhältst du den folgenden Fehler.

“0x80040216 – Expected to find one SdkMessageFilter for SdkMessageId {GUID} PrimaryEntity 10015 and SecondaryEntity 0. Found 0 records.”

Dabei handelt es sich um einen Fehler im CRM Online.
Der Microsoft Support hat den Fehler bestätigt. Er soll mit einem der nächsten URs behoben werden.

Workaround: Die Solution mit der Action ohne registrierten Step importieren und den Step auf dem Zielsystem mit dem Plugin Registration Tool manuell registrieren.

CRM Login Versuch scheitert mit Login Prompt und 401

Symptom
Beim Versuch sich im CRM einzuloggen erscheint ein Login Prompt. Obwohl der Username und das Passwort richtig eingegeben werden erscheint der Prompt wieder. Nach ein paar Versuchen erscheint “HTTP Error 401 – Unauthorized Access is denied”.

Ausgangslage
Die Authentifizierung am CRM erfolgt über ADFS (Claims Authentication und IFD ist eingeschalten).

Verifizierung
Im Eventlog des CRM Servers erscheint der folgende Eintrag:
Exception message: ID4175: The issuer of the security token was not recognized by the IssuerNameRegistry. To accept security tokens from this issuer, configure the IssuerNameRegistry to return a valid name for this issuer.

Ursache
Der ADFS signiert seine Tokens mit einem Token Signing Cert.
Das CRM (oder genauer die WIF) überprüft anhand eines Thumbprints ob der erhaltene Token von einer Vertrauenswürdigen Stelle stammt.Ändert sich das Zertifikat, so ändert sich auch der Thumbprint und das CRM nimmt den Token nicht mehr entgegen. Das Token Singing Zertifikat wird von einem mittels Auto Certificate Rollover automatisch erneuert wenn es abgelaufen ist.

Lösung
1. Im CRM Deployment Manager Claims Auth und IFD ausschalten (die Konfiguration geht nicht verloren).
2. IIS Reset durchführen
3. Im CRM Deployment Manager Claims Auth und IFD, mit denselben Einstellunge, wieder einschalten.
4. Auf dem ADFS (ADFS Management Console) die Federation Metadata updaten.

http://support.microsoft.com/kb/2686840

Deployment Webservice – “ActiveDirectoryRightsCheck raising error”

Wenn du versuchst über den Deployment Webservice oder über PowerShell, mit dem “Create-Organization” Cmdlet, eine neue Organisation zu erstellen erhältst du die Fehlermeldung “ActiveDirectoryRightsCheck raising error : The current user does not have required permissions (read/write) for the following Active Directory group: CN=ReportingGroup GUID,OU=X,DC=Y,DC=Z”.

Die volle PowerShell Fehlermeldung:

Source : mscorlib
Method : HandleReturnMessage
Date : ….
Time : ….
Error : Message: The Deployment Service cannot process the request because one or more validation checks failed.
ErrorCode: –2147167645
Stack Trace :
======================================================================================================================
Inner Exception Level 1 :
==DeploymentServiceFault Info==========================================================================================
Error : The Deployment Service cannot process the request because one or more validation checks failed.
Time : …
ErrorCode : –2147167645
Date : …
Time : …
Error Items:
ActiveDirectoryRightsCheck raising error : The current user does not have required permissions (read/write) for the following Active Directory group:
CN=ReportingGroup GUID,OU=X,DC=Y,DC=Z
======================================================================================================================
+ CategoryInfo : InvalidData: (Microsoft.Crm.P…anizationCmdlet:NewCrmOrganizationCmdlet) [New-CrmOrganization], FaultException`1
+ FullyQualifiedErrorId : CRM Deployment Cmdlet Error,Microsoft.Crm.PowerShell.NewCrmOrganizationCmdlet
+ PSComputerName : ……

Ursache
Der Service Account des Deployment Webservices hat nicht die benötigten Rechte um auf der “ReportingGroup {GUID}” AD-Gruppe Änderungen vorzunehmen.

Lösung
Der Service Account muss im Active Directory auf der OU, in dem die CRM Gruppen liegen, berechtigt werden.

Deployment Service 1

Deployment Service 2

CRM 4 Workflows werden nicht mehr ausgeführt

Im CRM 4 werden keine Workflows nicht ausgeführt. Der Tracelog enthält folgenden Eintrag: Exception while trying to execute AsyncOperationId: {GUID} AsyncOperationType: 12 – System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. —> System.IO.IOException: The handshake failed due to an unexpected packet format.

Die Ursache des Problems ist, dass der Async Service probiert über SSL (https) auf den CRM Service zuzugreifen und dabei scheitert.

Verifizieren des Problems:

  • Das Problem tritt bei jedem Workflow auf dem System auf
  • Der “Microsoft CRM Asynchronous Processing Service” läuft
  • EinNeustart des “Microsoft CRM Asynchronous Processing Service” behebt das Problem nicht
  • Die Bindings für das IIS Web für das CRM beinhalten http wie auch https

Beheben des Problems:

  1. Öffnen der “MSCRM_CONFIG” Datenbank
  2. Navigieren zur “DeploymentProperties” Tabelle
  3. Die Spalte “NVarCharColumn” des Datensatzes “AsyncSdkRootDomain” editierten. Der Port muss entfernt werden. “crm.contoso.ch:80” wird zu “crm.contoso.ch”
  4. Neustarten des “Microsoft CRM Asynchronous Processing Service”

CRM 2011/2013 eingebundene Silverlight Webressource wird nicht gerendert

Der ursprünglich wurde folgendes HTML in einer Webressource hochgeladen:

<form id="form1" runat="server" style="height:100%">
    <div id="silverlightControlHost">
        < object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="100%" height="100%">
            <param name="source" value="something" />
            <param name="onError" value="onSilverlightError" />
            <param name="background" value="white" />
            <param name="minRuntimeVersion" value="5.0.61118.0" />
            <param name="autoUpgrade" value="true" />
            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=5.0.61118.0" style="text-decoration:none">
                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none" />
            </a>
        </object>
    </div>
</form>

Editiert man nun diese Webressource im Web basierten Webressourcen-Editor wird daraus folgendes:


<FORM style="HEIGHT: 100%" id=form1 runat="server">
    <div id=silverlightControlHost>
        < object 
                data="data:application/x-oleobject;base64,QfXq3+HzJEysrJnDBxUISgAJAAAjSAAAcyMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" 
                width="100%" type=application/x-silverlight-2 height="100%">
            <a href="http://go.microsoft.com/fwlink/?LinkID=149156&amp;v=5.0.61118.0" style="text-decoration:none">
                <img src="http://go.microsoft.com/fwlink/?LinkId=161376" alt="Get Microsoft Silverlight" style="border-style:none" />
            </a>
        </object>
    </div>
</FORM>

Es handelt sich hierbei um ein bekanntes Issue:
http://msdn.microsoft.com/en-us/library/cc189089%28v=vs.95%29.aspx

Never edit the HTML source code for a page hosting a Silverlight web resource using the text editor provided in the application. The text editor changes the HTML and breaks element definition necessary to host the Silverlight XAP web resource. For more information, see Using the Text Editor for HTML Web Resources. If you must use the text editor, omit the data="data:application/x-silverlight-2," parameter in the element. Although this should prevent breaking the Silverlight web resource, the text editor may still introduce other undesirable changes.