none
issue SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used

    Frage

  • Hallo,
    mein Problem ist wenn ich Uploade in blobstorage oder in tablestorage kommt das Problem (weiter unten).
    In ServiceConfiguration.cscfg ist auch eingeben
     <Setting name="DataConnectionString" value="UseDevelopmentStorage=true" />
    Ich habe das Beispiel Thumbnails Sample probiert das funktioniert gut also mit SQL server 2008 etc ist alles i.O.
    Ich kann das Problem nicht finden kann mir einer helfen?
    I have VS2010 RC Azure SDK (Feb. v1.1)
    Danke schon mal im voraus.
     

    Serverfehler in der Anwendung /.

    SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used

    Beschreibung: Unbehandelte Ausnahme beim Ausführen der aktuellen Webanforderung. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

    Ausnahmedetails: System.InvalidOperationException: SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used

    Quellfehler:

    Zeile 23: 
    Zeile 24:                 
    Zeile 25:             var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
    
    
    Zeile 26:             var tableStorageClient = storageAccount.CreateCloudTableClient();
    Zeile 27:             tableStorageClient.CreateTableIfNotExist("MyGuestBookEntries");

    Quelldatei: C:\*********\HomeController.cs    Zeile: 25

    Stapelüberwachung:

    [InvalidOperationException: SetConfigurationSettingPublisher needs to be called before FromConfigurationSetting can be used]
       Microsoft.WindowsAzure.CloudStorageAccount.FromConfigurationSetting(String settingName) +72
       MyGuestBook.Controllers.HomeController..ctor() in C:\*****************************\HomeController.cs:25
    
    [TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht.]
       System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) +0
       System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) +86
       System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) +230
       System.Activator.CreateInstance(Type type, Boolean nonPublic) +67
       System.Activator.CreateInstance(Type type) +6
       System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +524
    
    [InvalidOperationException: An error occurred when trying to create a controller of type 'MyGuestBook.Controllers.HomeController'. Make sure that the controller has a parameterless public constructor.]
       System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +661
       System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +198
       System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +212
       System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +160
       System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +92
       System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +42
       System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +631
       System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +194
    
    Dienstag, 23. Februar 2010 15:49

Antworten

  • Hallo,

    eigentlich hat Azure dir die Lösung schon verraten - Du musst Azure sagen, wie Konfigurationseinstellungen geladen werden sollen. Ergänze dazu folgenden Code in Deiner Global.asax.cs:

    public class Global : System.Web.HttpApplication
    {
    
            protected void Application_Start(object sender, EventArgs e)
            {
                              
                CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSetter) =>
                            configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)));
            }
    }


    Über SetConfigurationSettingPublisher kannst Du Azure einen Delegate übergeben, der aufgerufen wird, wenn Azure eine Konfigurationseinstellung lädt. Im Code in meinem Beispiel lade ich den Konfigurationseintrag aus den Azure Konfigurationsdateien. Du könntest theoretisch so aber auch beliebige andere Konfigurationsquellen nutzen.
    • Als Antwort markiert MCCazy Mittwoch, 24. Februar 2010 10:04
    Dienstag, 23. Februar 2010 21:42

Alle Antworten

  • Hallo,

    eigentlich hat Azure dir die Lösung schon verraten - Du musst Azure sagen, wie Konfigurationseinstellungen geladen werden sollen. Ergänze dazu folgenden Code in Deiner Global.asax.cs:

    public class Global : System.Web.HttpApplication
    {
    
            protected void Application_Start(object sender, EventArgs e)
            {
                              
                CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSetter) =>
                            configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)));
            }
    }


    Über SetConfigurationSettingPublisher kannst Du Azure einen Delegate übergeben, der aufgerufen wird, wenn Azure eine Konfigurationseinstellung lädt. Im Code in meinem Beispiel lade ich den Konfigurationseintrag aus den Azure Konfigurationsdateien. Du könntest theoretisch so aber auch beliebige andere Konfigurationsquellen nutzen.
    • Als Antwort markiert MCCazy Mittwoch, 24. Februar 2010 10:04
    Dienstag, 23. Februar 2010 21:42
  • Danke für die Antwort also wenn ich das richtig verstehe soll ich in die .asp.cs das einfügen aber leider kommt noch die selbe Fehlermeldung. Hier mal der Quelltext

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Configuration;
    using System.Web;
    using Microsoft.WindowsAzure.StorageClient;
    using Microsoft.WindowsAzure;
    using Microsoft.WindowsAzure.ServiceRuntime;
    using System.Diagnostics;
    namespace My****.Repositories
    {


        public class DateienRepository
        {
            protected void Application_Start(object sender, EventArgs e)
            {

                CloudStorageAccount.SetConfigurationSettingPublisher(
                    (configName, configSetter) =>
                            configSetter(RoleEnvironment.GetConfigurationSettingValue(configName)));
            }

           
            private CloudBlobClient blobStorage = null;

           
            private CloudBlobContainer DateiContainer = null;

           
          
            public DateienRepository()
            {
              
               
                var storageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
                blobStorage = storageAccount.CreateCloudBlobClient();
                DateiContainer = blobStorage.GetContainerReference("Dateien");

               DateiContainer.CreateIfNotExist();
               
                  
                    var permissions = DateiContainer.GetPermissions();
                    permissions.PublicAccess = BlobContainerPublicAccessType.Container;
                    DateiContainer.SetPermissions(permissions);
                    Trace.TraceInformation("Container wurde erstellt");
              
                    Trace.TraceInformation("Container gesichert");
               
            }

            public void UploadDateiToContainer(HttpRequestBase request)
            {
                if (request.Files != null)
                {
                    if (request.Files.Count > 0)
                    {
                        HttpPostedFileBase file = request.Files[0];
                        CloudBlockBlob blob = DateiContainer.GetBlockBlobReference(file.FileName);
                        blob.Properties.ContentType = file.ContentType;
                        blob.UploadFromStream(file.InputStream);
                       

                    }
                }

            }

        }
    }

    Mittwoch, 24. Februar 2010 09:52
  • Hallo,

    Du musst den Code in den Code Deiner Application-Klasse (global.asax.cs) einfügen, nicht in Deine Repository-Klasse.

    Grüße,
    Mathias
    Mittwoch, 24. Februar 2010 21:11
  • Ok dank dir Mathias es hat funktioniert nun baut sich das nächste Problem auf^^
    bei

    DateiContainer.CreateIfNotExist();

    er meint

    Microsoft.WindowsAzure.StorageClient.StorageClientException wurde nicht von Benutzercode behandelt.
      Message=One of the request inputs is out of range.
      Source=Microsoft.WindowsAzure.StorageClient
      StackTrace:
           bei Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
           bei Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()
           bei Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImplWithRetry[T](Func`2 impl, RetryPolicy policy)
           bei Microsoft.WindowsAzure.StorageClient.CloudBlobContainer.CreateIfNotExist(BlobRequestOptions options)
           bei Microsoft.WindowsAzure.StorageClient.CloudBlobContainer.CreateIfNotExist()
           bei ****y..ctor() in C:\******.cs:Zeile 32.
           bei ****.Controllers.HomeController.PostBlob(FormCollection from) in*****.cs:Zeile 74.
           bei lambda_method(ExecutionScope , ControllerBase , Object[] )
           bei System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
           bei System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
           bei System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
           bei System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassa.<InvokeActionMethodWithFilters>b__7()
           bei System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
      InnerException: System.Net.WebException
           Message=Der Remoteserver hat einen Fehler zurückgegeben: (400) Ungültige Anforderung.
           Source=System
           StackTrace:
                bei System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
                bei Microsoft.WindowsAzure.StorageClient.EventHelper.ProcessWebResponse(WebRequest req, IAsyncResult asyncResult, EventHandler`1 handler, Object sender)
           InnerException:

    Gruß
    Cazy

    Donnerstag, 25. Februar 2010 20:22
  • Ja, das sind die tollen vielsagenden Fehlermeldungen, mit denen mich Azure sehr viel Zeit gekostet hat, und wegen denen ich Azure vorerst nicht weiter nutzen werde.

    Wie sieht der übrige Code dazu aus? Wie hast Du den Container benannt? Evtl. hast Du Zeichen im Namen, die Azure nicht mag.

    Grüße,
    Mathias
    Donnerstag, 25. Februar 2010 22:52