none
WCF DataService mit EF 6.1.3 datenbank zur Laufzeit wechseln RRS feed

  • Allgemeine Diskussion

  • Hallo Leute,

    ich möchte zur Laufzeit mit dem Dataservice auf die dem Benutzer zugeordnete Datenbank zugreifen. Die Datenbank steht verschlüsselt im Header.

    In verschiedenen Tutorals habe ich gelesen das ich die CreateDatasource function überschreiben muss, ich habe schon alles mögliche versucht aber ich bekomme es einfach nicht hin...

    Hier der Connectionstring aus der Webconfig bei dem ich den Initial Catalogue ändern möchte:

    <add name="InsikaEntities" connectionString="metadata=res://*/ODataService.insikaEntities.csdl|res://*/ODataService.insikaEntities.ssdl|res://*/ODataService.insikaEntities.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=DESKTOP-CUTLU62\MSSQLEXPRESS2014;initial catalog=Insika;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

    und Hier mein Dataservice:

    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Collections.Generic
    Imports System.Data.Services
    Imports System.Data.Services.Common
    Imports System.Data.Services.Providers
    Imports System.Linq
    Imports System.ServiceModel.Web
    Imports System.Web
    Imports taxidaten.TWDataService
    Imports Microsoft.AspNet.Identity.Owin
    Imports System.Net
    Imports System.Net.Http
    Imports System.Web.Http
    Imports Microsoft.AspNet.Identity
    Imports System.Data.EntityClient
    
    
    #If DEBUG Then
    <System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults:=True)> _
    <TWDataService.JSONPSupportBehavior> _
    Public Class DataService
    #Else
    <TWDataService.JSONPSupportBehavior> _
    Public Class DataService
    #End If
        Inherits EntityFrameworkDataService(Of InsikaEntities)
        Implements IServiceProvider
        ' This method is called only once to initialize service-wide policies.
        Public Shared Sub InitializeService(ByVal config As DataServiceConfiguration)
            ' TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
            ' Examples:
            ' config.SetEntitySetAccessRule("MyEntityset", EntitySetRights.AllRead)
            ' config.SetServiceOperationAccessRule("MyServiceOperation", ServiceOperationRights.All)
    
            config.SetEntitySetAccessRule("*", EntitySetRights.AllRead)
            config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3
    
    
    #If DEBUG Then
            config.UseVerboseErrors = True
    #End If
        End Sub
    
        Public Function GetService(ByVal serviceType As Type) As Object Implements IServiceProvider.GetService
    
            If serviceType Is GetType(IDataServiceStreamProvider) Then
                ' Return the stream provider to the data service.
                Return New TWDataService.ImageStreamProvider()
            End If
            Return Nothing
        End Function
    
        Protected Overrides Sub OnStartProcessingRequest(ByVal args As ProcessRequestArgs)
            Dim result = Utilitys.ValidateToken(HttpContext.Current.Request.Headers("Token"))
            If result = False Then
                Throw New DataServiceException(400, "Invalid login or password")
            End If
    
            MyBase.OnStartProcessingRequest(args)
        End Sub
    
        Protected Overrides Function CreateDataSource() As InsikaEntities
    
    
        End Function
    
    End Class
    

    bitte helft mir mit einem netten codesample ich bin fast am durchdrehen weil ich das Gefühl habe, dass ich mich einfach nur zu dämlich anstelle...

    Mittwoch, 11. Mai 2016 18:23

Alle Antworten

  • Hallo Marco Kosch,

    Nachfolgend ein Beispiel, wie Du die Verbindungszeichenfolge aus den App-Einstellungen auslesen kannst: Store Connection String in Web.config

    Dann kannst Du die Variable im Code ändern, indem Du den Anfangskatalog durch einen anderen ersetzt:

        string vzf = ConfigurationManager.ConnectionStrings["InsikaEntities"].connectionString; //Verbindungszeichenfolge auslesen
        int i = vzf.IndexOf("initial catalog");
        string Datenbankname = vzf.Substring(i+16, vzf.IndexOf(';', i+16) - i - 16);
        string vzf2 = vzf.Replace(Datenbankname, "Datenbank2");
    

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Donnerstag, 12. Mai 2016 18:18
    Administrator