[gelöst] Plugin wird nicht ausgeführt

20. Mai 2015 12:02

Hallo zusammen,

ich habe gerade eins meiner Plugins das noch aus CRM 4 stammte CRM 2011 tauglich gemacht. (Hoffe ich zumindest :-)) Nun habe ich es als Debug Version mit .pdb Datei kompelliert die dll zusammen mit der pdb im Testsystem unter C:\Program Files\Microsoft Dynamics CRM\Server\bin\assembly gepackt und dann als Plugin mit dem Plugin Registration Tool registriert. Dabei habe ich ausgewählt das die Speicherlokation die Festplatte sein soll. Soweit so richtig nach meinem Wissen. Anschließend habe ich einen Pre Operation Step mit der Message Create für meine Entität Gutschrift erstellt.
StepRegistration.png

Wenn ich nun eine Gutschirft im CRM erstelle passiert aber leider so gar nichts. Ich habe schon versucht mich über Remote Debugging einzuklinken aber da wird noch nicht mal der erste Breakpoint erreicht. Es sieht so aus als würde das Plugin schlicht gar nicht ausgeführt werden. Was mache ich denn da falsch? Bin etwas ratlos :( Laut jeder Anleitung die ich von Microsoft und nicht Microsoftseiten zu Plugin Registrierung und Debugging angesehen habe habe ich alles richtig gemacht und trotzdem funktioniert es nicht :cry:

oder liegt es vielleicht am code des Plugins? Ich meine da müsste alles richtig sein aber wie gesagt er springt schon nicht in die ersten zeilen. und das plugin scheint gar nicht erst ausgeführt zu werden.
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Crm.Sdk;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Crm.Sdk.Samples;
using System.ServiceModel;


namespace OPD.Crm2011.Gutschrift
{
    public class GutschriftnummernVergabe : IPlugin
    {
        private OrganizationServiceProxy _serviceProxy;
        private IOrganizationService _service;

        public void Execute(IServiceProvider serviceProvider)
      {
            // Obtain the execution context from the service provider.
            Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)
            serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
            
         // The InputParameters collection contains all the data passed in the message request.
         if (context.InputParameters.Contains("Target") &&
            context.InputParameters["Target"] is Entity)
            {
            
            // Obtain the target entity from the input parameters.
            Entity entity = (Entity)context.InputParameters["Target"];

                try
                {
                    ServerConnection serverConnect = new ServerConnection();
                    ServerConnection.Configuration serverConfig = serverConnect.GetServerConfiguration();

                    // Connect to the Organization service.
                    // The using statement assures that the service proxy will be properly disposed.
                    using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig))
                    {
                        // This statement is required to enable early-bound type support.
                        _serviceProxy.EnableProxyTypes();

                        _service = (IOrganizationService)_serviceProxy;

                        // Verify that the target entity represents an account.
                        // If not, this plug-in was not registered correctly.
                        if (entity.LogicalName == "opd_gutschrift")
                        {
                            //  Query using the paging cookie.
                            // Define the paging attributes.
                            // The number of records per page to retrieve.
                            int fetchCount = 1;
                            // Initialize the page number.
                            int pageNumber = 1;


                            // Define the condition expression for retrieving records.
                            ConditionExpression condition = new ConditionExpression();
                            condition.AttributeName = "OPD_gutschrift_zaehler";
                            condition.Operator = ConditionOperator.NotNull;

                            // Define the order expression to retrieve the records.
                            OrderExpression order = new OrderExpression();
                            order.AttributeName = "OPD_gutschrift_zaehler";
                            order.OrderType = OrderType.Descending;
                            QueryExpression query = new QueryExpression();
                            query.EntityName = "opd_gutschrift";
                            query.Criteria.AddCondition(condition);
                            query.Orders.Add(order);
                            query.ColumnSet.AddColumns("name", "address1_stateorprovince", "emailaddress1", "accountid");

                            // Assign the pageinfo properties to the query expression.
                            query.PageInfo = new PagingInfo();
                            query.PageInfo.Count = fetchCount;
                            query.PageInfo.PageNumber = pageNumber;

                            // The current paging cookie. When retrieving the first page,
                            // pagingCookie should be null.
                            query.PageInfo.PagingCookie = null;

                            DataCollection<Entity> entityCollection = _service.RetrieveMultiple(query).Entities;

                            int gutschriftnummer = 1000;
                            if (entityCollection.Count != 0)
                            {
                                foreach (OPD_gutschrift gutschrift in entityCollection)
                                {
                                    gutschriftnummer = gutschrift.OPD_gutschrift_zaehler.Value + 1;
                                }
                            }
                            String gutschriftid = "GUT-01000-A7B809";
                            String legalCharacters = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                            String randomString = "";
                            StringBuilder builder = new StringBuilder();
                            Random random = new Random();
                            char ch;
                            for (int i = 0; i < 6; i++)
                            {
                                ch = legalCharacters[random.Next(0, legalCharacters.Length)];
                                builder.Append(ch);
                            }
                            randomString = builder.ToString();

                            if (gutschriftnummer < 10000)
                            {
                                gutschriftid = "GUT-0" + gutschriftnummer + "-" + randomString;
                            }
                            else
                            {
                                gutschriftid = "GUT-" + gutschriftnummer + "-" + randomString;
                            }

                            entity.Attributes.Add("OPD_gutschrift_zaehler", gutschriftnummer);
                            entity.Attributes.Add("OPD_Gutschrift_nummer", gutschriftid);
                        }
                    }
                }
                // Catch any service fault exceptions that Microsoft Dynamics CRM throws.
                catch (FaultException<Microsoft.Xrm.Sdk.OrganizationServiceFault>)
                {
                    // You can handle an exception here or pass it back to the calling method.
                    throw;
                }
         }
        }
    }
}



Viele Grüße
Nicole
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Zuletzt geändert von Nicole Schmitz am 26. Mai 2015 14:54, insgesamt 1-mal geändert.

Re: Plugin wird nicht ausgeführt

20. Mai 2015 14:22

Hi Nicole,
wenn ich ein Plugin registriere, stelle ich es immer auf DataBase. Damit konnte ich immer Debuggen. Was ich dann auch gerne mach bei einer Erstellung, ich öffne meinen Datensatz gebe alles ein, bevor ich Speichere hänge ich Visual Studio an alle w3wp Einträge dran und Speichere dann. Falls du auf Asynchron umspringen sollten, entsprechend auch an alle Async Jobs. Damit habe ich bis jetzt jeder Plugin zum testen gebracht.
Falls was an deinem Code nicht stimmen sollte, glaube ich, dass du dein Plugin erst gar nicht registrieren konntest. Allerdings Fehler bei Abfragen von Datensätzen natürlich ausgeschlossen :).
Damit könntest du es mal versuchen.

Grüße
gE3z

Re: Plugin wird nicht ausgeführt

20. Mai 2015 14:30

Hallo gE3z,

habe es grade versucht indem ich das Plugin in die DataBase registiert habe aber leider geschieht wieder nix. Wenn mich mich an den w3wp Prozess anhänge werden die Haltepunkte als erreichbar markiert aber wenn ich die entsprechende Entität öffne passiert leider gar nichts :( :cry:

Viele Grüße
Nicole

Re: Plugin wird nicht ausgeführt

20. Mai 2015 14:34

habe es jetzt mal als Post Step ans Create gehängt und nicht als Pre jetzt kommt wenigstens ne Fehlermeldung
Unhandled Exception: System.ServiceModel.FaultException`1[[Microsoft.Xrm.Sdk.OrganizationServiceFault, Microsoft.Xrm.Sdk, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]: Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.Detail:
<OrganizationServiceFault xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.microsoft.com/xrm/2011/Contracts">
<ErrorCode>-2147220891</ErrorCode>
<ErrorDetails xmlns:d2p1="http://schemas.datacontract.org/2004/07/System.Collections.Generic">
<KeyValuePairOfstringanyType>
<d2p1:key>OperationStatus</d2p1:key>
<d2p1:value xmlns:d4p1="http://www.w3.org/2001/XMLSchema" i:type="d4p1:string">0</d2p1:value>
</KeyValuePairOfstringanyType>
</ErrorDetails>
<Message>Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.</Message>
<Timestamp>2015-05-20T12:31:54.701961Z</Timestamp>
<InnerFault i:nil="true" />
<TraceText>

[OPD.Crm2011.Gutschrift: OPD.Crm2011.Gutschrift.GutschriftnummernVergabe]
[9599d077-ebfe-e411-9414-005056a7075f: OPD.Crm2011.Gutschrift.GutschriftnummernVergabe: Create of opd_gutschrift]


</TraceText>
</OrganizationServiceFault>



Aber Debuggen kann ich immer noch nicht :cry:

Re: Plugin wird nicht ausgeführt

21. Mai 2015 08:51

Hi Nicole,
dann ists echt tricky. Wo hast du denn dein Haltepunkt angebracht?
Microsoft.Xrm.Sdk.IPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));
An diese Stelle würde ich den Haltepunkt setzen. Danach die Solution nochmal builden, im CRM Ordner ablegen und im Plugin Registration Tool updaten. Im Anschluss alle w3wp Prozesse nehmen und Datensatz erstellen.
Das würde ich mal versuchen, wenn noch nicht gemacht. Ansonsten vllt noch ein "Image" an den "Step" dran hängen und damit versuchen. (Zumindest arbeite ich immer mit Images an den Steps).
Die letzte Variante wäre eine Consolen Application / Windows Forms Application in deine Solution packen. Den Code von deinem Plugin in die Klasse kopieren und damit testen. Musst nur den Organization Service "manuell" erstellen. musst nur die Stellen mit "Input Parameters" kommentieren.

Grüße
gE3z

Re: Plugin wird nicht ausgeführt

21. Mai 2015 09:46

Hallo gE3z,

heute morgen klappt das mit dem Plugin debuggen auf einmal nach dem ich im Code noch den tracingservice eingefügt habe um wenigstens in der Fehlerdatei Infos zu bekommen. Schwups seit dem springt er ins Debugging. :shock: rätsel aber egal. dadurch habe ich jetzt immerhin rausgefunden wo der Hund begraben liegt. irgendwie habe ich mit der crmservicehelpers klasse wohl irgendeinen Fehler gemacht. ich war der Ansicht ich müsste diese aus dem sdk einfach nur in mein Projekt verlinken und könnte dann auf die Funktionen wie SeverConnection() und GetServerConfiguration() zugreifen und diese erledigen dann den Rest aber in der folgenden Funktion die von GetServerConfiguration() aufgerufen wird steigt das Plugin aus:

Code:
/// <summary>
        /// Obtains the name and port of the server running the Microsoft Dynamics CRM
        /// Discovery service.
        /// </summary>
        /// <returns>The server's network name and optional TCP/IP port.</returns>
        protected virtual String GetServerAddress(out bool ssl)
        {
            ssl = false;

            Console.Write("Enter a CRM server name and port [crm.dynamics.com]: ");
            String server = Console.ReadLine();

            if (server.EndsWith(".dynamics.com") || String.IsNullOrWhiteSpace(server))
            {
                ssl = true;
            }
            else
            {
                Console.Write("Is this server configured for Secure Socket Layer (https) (y/n) [n]: ");
                String answer = Console.ReadLine();

                if (answer == "y" || answer == "Y")
                    ssl = true;
            }

            return server;
        }


und zwar weil die Variable Server null bleibt. es ist ja auch kleinerlei Consolenanwendung das Plugin läuft ja im Hintergrund. Wie bekomme ich denn dann die ServerConfiguration? Ich steh da grade etwas ratlos. Tu mich manchmal echt schwer mit dem sdk :(

Viele Grüße
Nicole

Re: Plugin wird nicht ausgeführt

21. Mai 2015 12:21

hmm hab mal versucht mit der credential.xml zu arbeiten oder sogar im code selbst benutzer und Password zu übergeben, aber nix funktioniert *heul* es kann doch eigentlich nicht so schwer sein sich an dem blöden serviceproxy zu verbinden. vermisse im sdk irgendwie ein paar Beispiele wie man sich ohne konsolenanwendung am serviceproxy anmelden kann. :(

kann mir vielleicht irgendwer einen tipp geben wie ich ohne konsoleneingaben vorgehe? wie gebe ich bei sowas benutzer und Passwort mit?

viele Grüße
Nicole

Re: Plugin wird nicht ausgeführt

21. Mai 2015 13:03

Hi Nicole,
meinst du sowas vllt?
Der Code geht auch mit https Verschlüsselung:
Uri uri = null;
uri = new Uri("http://localhost:5555/OrgName/XRMServices/2011/Organization.svc");
uri = new Uri("https://localhost.orgname.com/XRMServices/2011/Organization.svc");
ClientCredentials creds = new ClientCredentials();
creds.UserName.UserName = "Domain\Username";
creds.UserName.Password = "Passwort";
_orgProxy = new OrganizationServiceProxy(uri, null, creds, null);
_orgProxy.EnableProxyTypes();
_service = (IOrganizationService)_orgProxy;
_orgContext = new OrganizationServiceContext(_service);
Oder arbeitest du mit CRM Online?

Grüße
gE3z

Re: Plugin wird nicht ausgeführt

26. Mai 2015 14:19

Hallo gE3z,

ich habe eine onPremise CRM Lösung.
Ich habe Deinen Code verwendet und komme damit zumindest schon mal etwas weiter und die Verbindung zum Service scheint hergestellt zu werden. Also vielen lieben Dank schonmal dafür. :)
Leider bekomme ich nun an anderer Stelle kurz danach wenn ich den Proxy verwenden will einen Fehler den ich nicht zu beheben verstehe:
A proxy type with the name account has been defined by another assembly. Current type: Account, OPD.Crm2011.Gutschrift, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2e4f917cabfaa499, Existing type: Account, OPD.Crm2011.Gutschrift, Version=1.0.0.0, Culture=neutral, PublicKeyToken=2e4f917cabfaa499

Ich habe schon versucht den Proxy an das aktuelle Assembly zu binden mit folgendem Codeschnipsel:
Code:
_orgProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior(Assembly.GetExecutingAssembly()));

Leider ohne Erfolg. :( da kam dann folgende Meldung:
Der Wert konnte der Sammlung nicht hinzugefügt werden, da die Sammlung bereits ein Objekt vom gleichen Typ enthält: "Microsoft.Xrm.Sdk.Client.ProxyTypesBehavior". Diese Instanz unterstützt nur jeweils eine Instanz von jedem Typ.
Parametername: item


Hast du dazu vielleicht auch noch eine Idee?

Das das immer alles so kompliziert sein muss :(

Viele Grüße
Nicole

Re: Plugin wird nicht ausgeführt

26. Mai 2015 14:54

ich glaube ich konnte es selbst lösen nachdem mir aufgefallen war das auch die tokennummer identisch war habe ich mal einen iisreset durchgeführt und siehe da seit dem funktioniert es und ich bekomme bei einer beispielquery des sdk etwas zurück. natürlich nicht bei meiner query da habe ich mal wieder irgendwo einen fehler eingebaut :roll: aber das ist ja dann ein anderes Thema wobei ich doch denke das ich da selbst noch dahinter komme :)

hoffe das mit dem iisreset war dann meine lösung daher stelle ich die frage erstmal auf gelöst :)

danke für eure hilfe und viele Grüße
Nicole