2017-09-05 2 views
0

Je crée une application dans Azure service Fabric API Web et je suis confronté à la question suivante:System.Runtime.InteropServices.COMException tout en utilisant le tissu de service

Exception:

System.Runtime.InteropServices.COMException occurred 
    ErrorCode=-2146233628 
    HResult=-2146233628 
    Message=Field of ByRef type. (Exception from HRESULT: 0x801312E4) 
    Source=mscorlib 
    StackTrace: 
     at System.Reflection.Emit.TypeBuilder.TermCreateClass(RuntimeModule module, Int32 tk, ObjectHandleOnStack type) 
     at System.Reflection.Emit.TypeBuilder.CreateTypeNoLock() 
     at System.Reflection.Emit.TypeBuilder.CreateTypeInfo() 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.MethodBodyTypesBuilder.BuildRequestBodyType(ICodeBuilderNames codeBuilderNames, CodeBuilderContext context, MethodDescription methodDescription) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.MethodBodyTypesBuilder.Build(ICodeBuilderNames codeBuilderNames, CodeBuilderContext context, MethodDescription methodDescription) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.MethodBodyTypesBuilder.Build(InterfaceDescription interfaceDescription) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.CodeBuilder.Microsoft.ServiceFabric.Services.Remoting.Builder.ICodeBuilder.GetOrBuildMethodBodyTypes(Type interfaceType) 
     at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable`1 source, Func`2 keySelector, Func`2 elementSelector, IEqualityComparer`1 comparer) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.ProxyGeneratorBuilder`2.Build(Type proxyInterfaceType, IEnumerable`1 interfaceDescriptions) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.CodeBuilder.Microsoft.ServiceFabric.Services.Remoting.Builder.ICodeBuilder.GetOrBuildProxyGenerator(Type interfaceType) 
     at Microsoft.ServiceFabric.Services.Remoting.Builder.ServiceCodeBuilder.GetOrCreateProxyGenerator(Type serviceInterfaceType) 
     at Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxyFactory.CreateServiceProxy[TServiceInterface](Uri serviceUri, ServicePartitionKey partitionKey, TargetReplicaSelector targetReplicaSelector, String listenerName) 
     at Microsoft.ServiceFabric.Services.Remoting.Client.ServiceProxy.Create[TServiceInterface](Uri serviceUri, ServicePartitionKey partitionKey, TargetReplicaSelector targetReplicaSelector, String listenerName) 
     at WebService.Controllers.HomeController.<GetAsync>d__0.MoveNext() in C:\Users\shkulka\Documents\Visual Studio 2015\Projects\SortingApp\WebService\Controllers\HomeController.cs:line 17 
    InnerException: 

ligne à laquelle exception se produit:

IRequestManagerService proxy = ServiceProxy.Create<IRequestManagerService>(new Uri("fabric:/SortingApp/RequestManagerService")); 

Une partie du code de référence:

namespace WebService.Controllers 
{ 
    [Route("api/[controller]")] 
    public class HomeController : Controller 
    { 
     [HttpGet] 
     public async Task<IActionResult> GetAsync(int opId, string sortType = "Quick", string guid="454", string commaSeperatedArray="1,2,3,4") 
     { 
      IRequestManagerService proxy = ServiceProxy.Create<IRequestManagerService>(new Uri("fabric:/SortingApp/RequestManagerService")); 
      //rest of the code continues . . . 

Exception se produit lorsque je tape l'adresse suivante:

http://localhost:8792/api/home?opId=0&sortType=Quick&guid=12&commaSeperatedArray=1,2,3,4 

Je suis en cours d'exécution mon projet avec des privilèges d'administrateur. La cible de la plateforme est x64 dans toute la solution.

Comment se débarrasser de l'exception?


Mise à jour 1:

avant de toucher l'URL, je peux observer le tissu en ce qui concerne le service suivant.

Dans l'explorateur de tissu de service:

enter image description here

Dans la fenêtre des événements de diagnostic:

{ 
    "Timestamp": "2017-09-06T10:49:34.7442479+05:30", 
    "ProviderName": "Microsoft-ServiceFabric-Services", 
    "Id": 2, 
    "Message": "RunAsync has been cancelled for a stateful service replica. The cancellation will be considered 'slow' if RunAsync does not halt execution within 4000 milliseconds. Application Type Name: GettingStartedApplicationType, Application Name: fabric:/GettingStartedApplication, Service Type Name: MyActorServiceType, Service Name: fabric:/GettingStartedApplication/MyActorService, Partition Id: 097c837b-857e-4f10-8c3a-8a902c1f0bb6, Replica Id: 131491461074099453", 
    "ProcessId": 34840, 
    "Level": "Informational", 
    "Keywords": "0x0000F00000000000", 
    "EventName": "StatefulRunAsyncCancellation", 
    "ActivityID": null, 
    "RelatedActivityID": null, 
    "Payload": { 
    "applicationTypeName": "GettingStartedApplicationType", 
    "applicationName": "fabric:/GettingStartedApplication", 
    "serviceTypeName": "MyActorServiceType", 
    "serviceName": "fabric:/GettingStartedApplication/MyActorService", 
    "partitionId": "097c837b-857e-4f10-8c3a-8a902c1f0bb6", 
    "replicaId": 131491461074099453, 
    "slowCancellationTimeMillis": 4000.0 
    } 
} 

{ 
    "Timestamp": "2017-09-06T10:49:34.760793+05:30", 
    "ProviderName": "Microsoft-ServiceFabric-Services", 
    "Id": 2, 
    "Message": "RunAsync has been cancelled for a stateful service replica. The cancellation will be considered 'slow' if RunAsync does not halt execution within 4000 milliseconds. Application Type Name: GettingStartedApplicationType, Application Name: fabric:/GettingStartedApplication, Service Type Name: MyActorServiceType, Service Name: fabric:/GettingStartedApplication/MyActorService, Partition Id: 78f9a969-4f09-4d8b-932f-4962cce7f4cd, Replica Id: 131491461074094464", 
    "ProcessId": 27832, 
    "Level": "Informational", 
    "Keywords": "0x0000F00000000000", 
    "EventName": "StatefulRunAsyncCancellation", 
    "ActivityID": null, 
    "RelatedActivityID": null, 
    "Payload": { 
    "applicationTypeName": "GettingStartedApplicationType", 
    "applicationName": "fabric:/GettingStartedApplication", 
    "serviceTypeName": "MyActorServiceType", 
    "serviceName": "fabric:/GettingStartedApplication/MyActorService", 
    "partitionId": "78f9a969-4f09-4d8b-932f-4962cce7f4cd", 
    "replicaId": 131491461074094464, 
    "slowCancellationTimeMillis": 4000.0 
    } 
} 

Après avoir frappé URL:

enter image description here


Mise à jour 2:

Interface:

namespace RequestManagerService.Interfaces 
{ 
    public interface IRequestManagerService : IService 
    { 
     Task submitSortRequest(string sortType, string guid, string commaSeperatedArray); 
     Task<bool> isSortingComplete(string guid); 
     Task<string> getSortedArray(string guid); 
     Task<bool> isSortRequested(string sortType, ref string commaSeperatedArray, ref string guid); 
     Task setSortResult(string sortType, string guid, string sortedArray); 
    } 
} 

mise en œuvre Interface:

namespace RequestManagerService 
{ 
    /// <summary> 
    /// An instance of this class is created for each service instance by the Service Fabric runtime. 
    /// </summary> 
    internal sealed class RequestManagerService : StatelessService, IRequestManagerService 
    { 
     // <guid,<sorttype, array, isSortComplete>> 
     Dictionary<string, Tuple<string, string, bool>> SortDictionary = new Dictionary<string, Tuple<string, string, bool>>(); 
     public RequestManagerService(StatelessServiceContext context) 
      : base(context) 
     { 

     } 

     public async Task<string> getSortedArray(string guid) 
     { 
      Tuple<string, string, bool> tempTuple; 
      string sortedArray= ""; 

      if (await isSortingComplete(guid)) 
      { 
       SortDictionary.TryGetValue(guid, out tempTuple); 
       sortedArray = tempTuple.Item2; 
      } 
      else 
      { 
       sortedArray = "Either there no request with this guid or the sorting is not yet complete."; 
      } 
      return sortedArray; 
     } 

     public Task<bool> isSortingComplete(string guid) 
     { 
      bool isSortComplete = false; 
      Tuple<string, string, bool> tempTuple; 

      if (SortDictionary.ContainsKey(guid)) { 
       SortDictionary.TryGetValue(guid, out tempTuple); 
       isSortComplete = tempTuple.Item3; 
      } 

      return Task.FromResult(isSortComplete); 
     } 

     public Task<bool> isSortRequested(string sortType, ref string commaSeperatedArray, ref string guid) 
     { 
      bool requestFound = false; 

      foreach(KeyValuePair<string, Tuple<string, string, bool>> entry in SortDictionary) 
      { 
       if (entry.Value.Item1 == sortType && entry.Value.Item3 == false) 
       { 
        commaSeperatedArray = entry.Value.Item2; 
        guid = entry.Key; 
        requestFound = true; 
        break; 
       } 
      } 

      return Task.FromResult(requestFound); 
     } 

     public Task setSortResult(string sortType, string guid, string sortedArray) 
     { 
      if (SortDictionary.ContainsKey(guid)) 
      { 
       Tuple<string, string, bool> updatedTuple = new Tuple<string, string, bool>(sortType, sortedArray, true); 
       SortDictionary[guid] = updatedTuple; 
      } 
      return Task.FromResult<object>(null); 
     } 

     public Task submitSortRequest(string sortType, string guid, string commaSeperatedArray) 
     { 
      Tuple<string, string, bool> tuple = new Tuple<string, string, bool>(sortType, commaSeperatedArray, false); 
      SortDictionary.Add(guid, tuple); 
      return Task.FromResult<object>(null); 
     } 

     /// <summary> 
     /// Optional override to create listeners (e.g., TCP, HTTP) for this service replica to handle client or user requests. 
     /// </summary> 
     /// <returns>A collection of listeners.</returns> 
     protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners() 
     { 
      return new ServiceInstanceListener[1] { 
       new ServiceInstanceListener(this.CreateServiceRemotingListener) 
      }; 
     } 

     /// <summary> 
     /// This is the main entry point for your service instance. 
     /// </summary> 
     /// <param name="cancellationToken">Canceled when Service Fabric needs to shut down this service instance.</param> 
     protected override async Task RunAsync(CancellationToken cancellationToken) 
     { 
      // TODO: Replace the following sample code with your own logic 
      //  or remove this RunAsync override if it's not needed in your service. 

      long iterations = 0; 

      while (true) 
      { 
       cancellationToken.ThrowIfCancellationRequested(); 

       ServiceEventSource.Current.ServiceMessage(this.Context, "Working-{0}", ++iterations); 

       await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken); 
      } 
     } 
    } 
} 
+0

Pourriez-vous s'il vous plaît partager la mise en œuvre du contrat du service auquel vous essayez d'accéder? –

+0

@KirylZ: Hey, vient d'ajouter l'interface et son implémentation. S'il vous plaît faites le moi savoir si vous avez une idée. –

+0

Je dirais que les paramètres ref/out ne sont pas pris en charge dans les contrats ici. Débarrassez-vous d'eux et essayez à nouveau. –

Répondre

0

Je dirais que ref/sur les paramètres ne sont pas pris en charge dans les contrats ici. Idéalement, votre contact de service ne doit pas s'appuyer sur des artefacts spécifiques à la langue. Débarrassez-vous d'eux et les choses devraient bien fonctionner.

+0

Big, Big merci!Si possible me diriger vers une ressource qui mentionne les paramètres ref/out n'est pas supportée dans les contrats. J'aimerais lire plus. –

+1

De rien. La seule référence dans toute la documentation SF que je rappelle est [https://docs.microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-get-started](https://docs. microsoft.com/en-us/azure/service-fabric/service-fabric-reliable-actors-get-started). Vous y trouverez "Les méthodes de l'interface Actor ne doivent pas avoir de paramètres out, ref ou optionnels.". –

+0

Je sais que dans WCF, il est possible de définir des contrats avec le paramètre ref, mais le type de retour doit être 'void'. Comme avec l'écouteur distant SF, vos méthodes doivent être des méthodes asynchrones retournant la tâche, cela pourrait être la raison qui vous empêche d'utiliser le paramètre ref. –