zweite IIS Website statt ISV

2. Juni 2015 11:06

Hallo zusammen,

kann ich auf dem CRM Server im IIS der die CRM Webseite hostet problemlos eine zweite eigene Website erstellen oder gibt das Probleme mit dem CRM? die User greifen mit dem Internetexplorer über http://srv-crm/OPDCRM/main.aspx auf den CRM Server zu. würde der Link so weiterhin funktionieren? kenn mich mit dem IIS leider nicht so gut aus. Habe nur den Tipp bekommen meine ASPX Erweiterungen aus dem ISV in eine eigene IISWebsite auszulagern. So würden sie auch unter CRM 2015 weiterhin anwendbar sein.

Viele Grüße
Nicole

Re: zweite IIS Website statt ISV

2. Juni 2015 15:00

Hallo Nicole,
ich meine sogar das es von Microsoft unsupportet ist, die WebSite im ISV Folder abzulegen.
Der Link würde weiterhin so funktionieren. (Es sind die Einstellungen der 2ten IIS Website die du berücksichtigen musst muss halt anderer Port und andere Namensauflösung, etc sein).

Grüße
gE3z

Re: zweite IIS Website statt ISV

3. Juni 2015 08:27

Hallo Nicole,

die Verwendung des ISV-Ordners wird ab der Version 2013 nicht mehr unterstützt und ist auch schon in der Version 2011 in der Funktion eingeschränkt.
Um deine Frage genauer beantworten zu können müssten wir wissen, was du mit dieser eigenen Website erreichen willst.

Re: zweite IIS Website statt ISV

3. Juni 2015 09:27

Hallo zusammen,

Einen anderen Port habe ich schon eingestellt bei der zweiten Seite verwende ich den 8080 mit der Namensauflösung muss ich nochmal gucken ob ich das richtig gemacht habe. Ich weiß das 2011 schon nicht mehr ISV verwenden sollte aber unsere Funktion funktioniert halt noch leider wird sie das im CRM 2013 nicht mehr.
Es geht hier wie in meinem anderen Thread um das Kopieren von Angeboten. Bevor ich die HTML 5 Geschichte angehe war halt die Überlegung ob ich unsere Anwendung so auf einer anderen Website einfach weiter benutzen kann. Dann wäre der Aufwand nicht so groß das neu zu entwickeln zumal ich mich in HTML 5 erst komplett neu einarbeiten müsste.

Die Webanwendung holt nach dem Öffnen die Angebotsguid aus dem Link (der Button liegt im Angebotsmenü und öffnet die Webanwendung mit Übergabe der Angebotsguid). Über die Angebotsguid werden mit einer QueryExpression alle Daten des Angebots geholt. Dann wird ein neues Angebot erzeugt und die Daten aus dem zu kopierenden Angebot eingetragen. Danach holt eine zweite QueryExpression alle Daten der Angebotsprodukte des zu kopierenden Angebots und legt im neuen Angebot alle Angebotsprodukte an. Die Website führt dann einen Redirect auf das neue Angebot aus. Das mit dem Redirect ist auch der einzige Grund warum ich das nicht über ein Plugin lösen kann. Ich möchte halt das sich nach drücken des Kopierenbuttons das neue Angebot direkt öffnet damit die Vertriebler sofort weiter arbeiten können und nicht erst die Kopie suchen müssen und soweit ich das versteh würde das über ein Plugin alleine nicht gehen oder?

Viele Grüße
Nicole

Re: zweite IIS Website statt ISV

3. Juni 2015 12:33

Hallo zusammen,

kann ich mich über diese Webanwendung die auf einer separaten iss Seite läuft nicht wie gewohnt mit dem crm verbinden? da ganze steigt mir in der crmservicehelper.cs an der folgenden stelle aus weil securitytoken fehlt.

Code:
public ManagedTokenDiscoveryServiceProxy(IServiceManagement<IDiscoveryService> serviceManagement,
            SecurityTokenResponse securityTokenRes)
            : base(serviceManagement, securityTokenRes)
        {
            this._proxyManager = new AutoRefreshSecurityToken<DiscoveryServiceProxy, IDiscoveryService>(this);
        }


Der Code zum Verbinden mit dem CRM sieht wie folgt aus:
Code:
ClientCredentials creds = new ClientCredentials();
            creds.UserName.UserName = "domain\\user";
            creds.UserName.Password = "password";

            ServerConnection.Configuration serverConfig = new ServerConnection.Configuration();
            serverConfig.OrganizationUri = new Uri("http://srv-crm-dev/OPDCRMDevel/XRMServices/2011/Organization.svc");
            serverConfig.Credentials = creds;
           
            using (_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig))
            {....

Re: zweite IIS Website statt ISV

3. Juni 2015 13:26

Hallo Nicole,
ich sehe zum ersten Mal das mit dem AutoRefreshSecurityToken. Warum benötigst du diesen? Eigentlich müsstest du dich mit deinem Code am CRM anmelden können. Bin mir nicht sicher, ob du dann für die 2te IIS Seite auch ein Zertifikat brauchst.
Was du machen kannst, beide IIS Websites (CRM und deine) die Authentications überprüfen, vllt gibts hier ein Missmatch. Alternativ Tracing / EventViewer anschauen.

Grüße
gE3z

Re: zweite IIS Website statt ISV

8. Juni 2015 11:35

Hallo gE3z,

ich habe keine Ahnung warum ich diese Token benötige :-( das CRM fragt einfach danach. Sehr seltsam. Ich habe mal das Tracing angeschaltet. Mit der Meldung kann ich aber nicht wirklich was anfangen bzw. ich sehe nicht wie ich ihr beikommen kann.

# CRM Tracing Version 2.0
# LocalTime: 2015-06-08 08:56:37.540
# Categories:
# CallStackOn: No
# ComputerName: SRV-CRM-DEV
# CRMVersion: 5.0.9690.2015
# DeploymentType: OnPremise
# ScaleGroup:
# ServerRole: AppServer, AsyncService, DiscoveryService, ApiServer, HelpServer, DeploymentService, SandboxServer, DeploymentManagementTools

[2015-06-08 08:56:37.540] Process: w3wp |Organization:617a9825-5d96-4657-84a1-685b3ebf3211 |Thread: 15 |Category: Exception |User: 00000000-0000-0000-0000-000000000000 |Level: Error | SystemLabelDictionaryCacheLoader.LogDetails
at SystemLabelDictionaryCacheLoader.LogDetails(Int32 languageCode, Int32 totalLabels, IOrganizationContext context)
at LabelDictionaryCacheLoader.LoadCacheData(Int32 languageCode, IOrganizationContext context)
at LabelCache.TryLookupEntry(Int32 languageCode, Guid objectId, String objectColumnName, IOrganizationContext context)
at LabelCacheLabelCollection.HasLabels(IOrganizationContext context)
at PreloadedOptionSetMetadataDataProvider.CreateEntityNameReferenceOptions(SortedList`2& optionsSorted, IOrganizationContext organizationContext)
at PreloadedOptionSetMetadataDataProvider.LoadEntityNameReferenceOptionsIfNecessary(IOrganizationContext context, LoadMasks masks)
at PreloadedOptionSetMetadataDataProvider.InitializeOptions(IPreloadedMetadataInitializationContext context, LoadMasks masks, IOrganizationContext organizationContext)
at PreloadedMetadataCacheDataProvider.InitializeOptionSets(IPreloadedMetadataInitializationContext context, LoadMasks masks, IOrganizationContext organizationContext)
at PreloadedMetadataCacheDataProvider.Initialize(IOrganizationContext organizationContext, MetadataContainer container, LoadMasks masks)
at MultiOrgSharableMetadataCacheLoader.CreateMetadataCacheDataProvider(MetadataContainer container, IOrganizationContext context, LoadMasks masks, CounterList counter)
at DynamicMetadataCacheLoader.BuildMetadataCacheFromMetadataContainer(MetadataContainer container, LoadMasks masks, IOrganizationContext context, CounterList counter)
at DynamicMetadataCacheLoader.LoadCacheFromDatabaseInternal(LoadMasks masks, CrmDbConnection connection, CrmTransaction transaction, IOrganizationContext context, CounterList counter)
at DynamicMetadataCacheLoader.LoadCacheFromDatabase(LoadMasks masks, IOrganizationContext context, CounterList counter)
at DynamicMetadataCacheFactory.LoadMetadataCache(LoadMethod method, CacheType type, IOrganizationContext context)
at MetadataCache.LoadCache(IOrganizationContext context, Boolean fileOnlyIfExists)
at MetadataCache.GetInstance(IOrganizationContext context)
at BusinessEntityMoniker..ctor(Guid id, String entityName, IOrganizationContext orgContext)
at OrganizationSettingsCacheLoader.LoadCacheData(Guid key, ExecutionContext context)
at ObjectModelCacheLoader`2.LoadCacheData(TKey key, IOrganizationContext context)
at CrmMultiOrgCache`2.CreateEntry(TKey key, IOrganizationContext context)
at CrmMultiOrgCache`2.LookupEntry(TKey key, IOrganizationContext context)
at WsdlMessageInspector.GetServiceDescription(Message reply, Nullable`1 flatQuery)
at WsdlMessageInspector.BeforeSendReply(Message& reply, Object correlationState)
at ImmutableDispatchRuntime.BeforeSendReplyCore(MessageRpc& rpc, Exception& exception, Boolean& thereIsAnUnhandledException)
at ImmutableDispatchRuntime.PrepareReply(MessageRpc& rpc)
at ImmutableDispatchRuntime.ProcessMessage8(MessageRpc& rpc)
at ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at MessageRpc.Process(Boolean isOperationContextSet)
at ChannelHandler.DispatchAndReleasePump(RequestContext request, Boolean cleanThread, OperationContext currentOperationContext)
at ChannelHandler.HandleRequest(RequestContext request, OperationContext currentOperationContext)
at ChannelHandler.AsyncMessagePump(IAsyncResult result)
at AsyncThunk.UnhandledExceptionFrame(IAsyncResult result)
at AsyncResult.Complete(Boolean completedSynchronously)
at AsyncQueueReader.Set(Item item)
at InputQueue`1.EnqueueAndDispatch(Item item, Boolean canDispatchOnThisThread)
at InputQueue`1.EnqueueAndDispatch(T item, Action dequeuedCallback, Boolean canDispatchOnThisThread)
at SingletonChannelAcceptor`3.Enqueue(QueueItemType item, Action dequeuedCallback, Boolean canDispatchOnThisThread)
at EnqueueMessageAsyncResult.CompleteParseAndEnqueue(IAsyncResult result)
at EnqueueMessageAsyncResult.HandleParseIncomingMessage(IAsyncResult result)
at AsyncResult.SyncContinue(IAsyncResult result)
at EmptyHttpPipeline.BeginProcessInboundRequest(ReplyChannelAcceptor replyChannelAcceptor, Action dequeuedCallback, AsyncCallback callback, Object state)
at HttpContextReceivedAsyncResult`1.ProcessHttpContextAsync()
at HttpChannelListener`1.BeginHttpContextReceived(HttpRequestContext context, Action acceptorCallback, AsyncCallback callback, Object state)
at HostedHttpTransportManager.HttpContextReceived(HostedHttpRequestAsyncResult result)
at HostedHttpRequestAsyncResult.HandleRequest()
at HostedHttpRequestAsyncResult.BeginRequest()
at HostedHttpRequestAsyncResult.OnBeginRequest(Object state)
at AspNetPartialTrustHelpers.PartialTrustInvoke(ContextCallback callback, Object state)
at HostedHttpRequestAsyncResult.OnBeginRequestWithFlow(Object state)
at ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
at IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
at _IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
>Not an error. System LabelDictionary was loaded for language 1031 from organization {617A9825-5D96-4657-84A1-685B3EBF3211} with 19431 labels

Re: zweite IIS Website statt ISV

13. Juni 2015 11:29

Das Token benötigst du für die Anmeldung am CRM. Damit nicht bei jedem Aufruf einer CRM-Seite eine Authentifizierung gegen das AD erfolgen muss, wird bei der ersten Anmeldung ein Token erzeugt, der dann für die Authentifizierung verwendet wird. Der Token sagt dem CRM, das der Benutzer gegenüber dem AD authentifiziert ist und dies nicht erneut erfolgen muss.

Re: zweite IIS Website statt ISV

17. Juni 2015 09:06

Hallo Michael,

achso ok dann habe ich verstanden wofür ich das Token benötige. Nur leider weiß ich nicht wie ich es erzeugen kann. :(

Viele Grüße
Nicole