2010-06-23 6 views
1

J'ai un devoir pour héberger le service WCF en utilisant le mécanisme de session WCF.Service de session WCF hébergé dans l'application ASP.NET MVC 2.0

J'ai lu http://msdn.microsoft.com/en-us/library/ms733040.aspx mais il ne suffit pas ...

Mon simple, scenearion:

Je solution avec 4 projets. First-SessionWCF.Base est une bibliothèque de classes simple qui contient l'interface de base IServiceBase pour mon service.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 

namespace SessionWCF.Base 
{ 
    [ServiceContract(SessionMode = SessionMode.Required)] 
    public interface IServiceBase 
    { 
     [OperationContract(IsInitiating = true, IsTerminating = false)] 
     void BeginSession(string message); 

     [OperationContract(IsInitiating = false, IsTerminating = false)] 
     string GetMessage(int number); 

     [OperationContract(IsInitiating = false, IsTerminating = true)] 
     void EndSession(); 
    } 
} 

Deuxième - SessionWCF.Lib, il est WCF Bibliothèque de classes qui contient une interface de service ISessionService et classe de service SessionService, il a référence de projet à SessionWCF.Base

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using SessionWCF.Base; 

namespace SessionWCF.Lib 
{ 
    [ServiceContract(SessionMode = SessionMode.Required)] 
    public interface ISessionService : IServiceBase 
    { 
    } 
} 

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ServiceModel; 
using System.ServiceModel.Activation; 

namespace SessionWCF.Lib 
{ 
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)] 
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
    public class SessionService : ISessionService 
    { 
     string message = ""; 

     #region ISessionService Members 

     public void BeginSession(string message) 
     { 
      this.message = message; 
     } 

     public string GetMessage(int number) 
     { 
      return "message: " + message + " number: " + number; 
     } 

     public void EndSession() 
     { 
      message = ""; 
     } 

     #endregion 
    } 
} 

Troisième - SessionWCF.Web il est Application ASP.NET MVC 2.0 qui a le fichier SessionService.svc. J'ai supprimé le code derrière et ouvert l'éditeur XML, ce service est pointé vers le service à partir de SessionWCF.Lib, et bien sûr ce projet fait référence à SessionWCF.Lib.

SessionService.svc:

<%@ ServiceHost Language="C#" Debug="true" Service="SessionWCF.Lib.SessionService" CodeBehind="SessionWCF.Lib.SessionService.cs" %> 

Web.config:

<system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" /> 
    <services> 
     <service behaviorConfiguration="SessionServiceBehavior" name="SessionWCF.Web.SessionService"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="largeMessageHttpBinding" contract="SessionWCF.Lib.ISessionService"> 
      <identity> 
      <dns value="**********"/> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://**********/SessionWCF/SessionService.svc"/> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="largeMessageHttpBinding" maxReceivedMessageSize="10485760"> 
      <readerQuotas maxArrayLength="100000"/> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name=""> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     <behavior name="SessionServiceBehavior"> 
      <serviceMetadata httpGetEnabled="True"/> 
      <serviceDebug includeExceptionDetailInFaults="True"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 

Quatrième - SessionWCF.WPF il est WPF application standard que contanins classe SessionProxy et événement sous forme de XAML cliquer pour appeler le service Web . Ce projet contient une référence au premier SessionWCF.Base.

classe SessionProxy:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using SessionWCF.Base; 
using System.ServiceModel; 

namespace SessionWCF.WPF 
{ 
    public class SessionProxy 
    { 
     public IServiceBase Proxy { get; set; } 

     public SessionProxy(string url) 
     { 
      WSHttpBinding binding = new WSHttpBinding(); 
      binding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
      binding.OpenTimeout = new TimeSpan(0, 1, 0); 
      ChannelFactory<IServiceBase> factory = new ChannelFactory<IServiceBase>(binding, 
       new EndpointAddress(url)); 
      Proxy = factory.CreateChannel(); 
     } 
    } 
} 

événement Click sous forme de XAML:

private void Button_Click(object sender, RoutedEventArgs e) 
     { 
      string url = "http://**********/SessionWCF/SessionService.svc"; 
      SessionProxy client = new SessionProxy(url); 

      client.Proxy.BeginSession("my message"); 
      string msg = client.Proxy.GetMessage(666); 
      client.Proxy.EndSession(); 

      txtMsg.Text = msg; 
     } 

maintenant:

Quand j'appelle un service Web dans le navigateur Web que j'ai rencontrer l'erreur suivante:

Error in '/SessionWCF' Application. 
Contract requires Session, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Contract requires Session, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it. 

Source Error: 
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 


Stack Trace: 

[InvalidOperationException: Contract requires Session, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it.] 
    System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result) +16376242 
    System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost) +1940 
    System.ServiceModel.ServiceHostBase.InitializeRuntime() +82 
    System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +64 
    System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +789 
    System.ServiceModel.HostingManager.ActivateService(String normalizedVirtualPath) +287 
    System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath) +1132 

[ServiceActivationException: The service '/SessionWCF/SessionService.svc' cannot be activated due to an exception during compilation. The exception message is: Contract requires Session, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it..] 
    System.Runtime.AsyncResult.End(IAsyncResult result) +890624 
    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +180062 
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +136 


Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.1 

Quand je l'appelle dans mon événement XAML je reçois ServiceActivationException:

The requested service, 'http://**********/SessionWCF/SessionService.svc' could not be activated. See the server's diagnostic trace logs for more information. 

Est-il une mauvaise configuration dans web.config? Peut-être qu'il me manque quelque chose dans les attributs de service? Et le plus important. Pourquoi cela m'avertit à propos de BasicHttpBinding quand je ne l'utilise pas ???

Quelqu'un pourrait m'aider s'il vous plaît? C'est essentiel pour mon projet actuel ...

Cordialement, Daniel Skowroński

MISE À JOUR:

@marc_s

Premièrement:

Je pense que côté serveur est erroné parce que quand je colle simplement url « http : //**********/SessionWCF/SessionService.svc 'dans n'importe quel navigateur Web j'obtiendrai l'erreur "Le contrat exige la session, mais lie ing 'BasicHttpBinding' ne le supporte pas ou n'est pas configuré correctement pour le supporter. "À la place des métadonnées ...

Deuxièmement:

Dans mon client application WPF j'ai toujours deux options:

Première - Créer référence de service et IDE génère automatiquement la classe proxy et ajouter toute la configuration à l'application. config

ici, je ne peux pas le faire parce que je reçois la même erreur que dans le navigateur Web lorsque je signale au service Web service concepteur de référence

deuxième -.. Créer poxy manuellement et l'application de liaison c onfiguration du code, cela me donne l'occasion de créer étape proxy par étape, mais il semble que ServiceActivationException est le même problème « ACTIVATION », vous pouvez voir dans la pile trace ces lignes:

[ServiceActivationException: The service '/SessionWCF/SessionService.svc' cannot be activated due to an exception during compilation. The exception message is: Contract requires Session, but Binding 'BasicHttpBinding' doesn't support it or isn't configured properly to support it..] 
    System.Runtime.AsyncResult.End(IAsyncResult result) +890624 
    System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +180062 
    System.Web.CallHandlerExecutionStep.OnAsyncHandlerCompletion(IAsyncResult ar) +136 

Cordialement, Daniel Skowroński

MISE À JOUR:

@marc_s

Je ne c'est le cas parce que:

Premièrement:

<services> 
    <service name="SessionWCF.Web.SessionService" 
      behaviorConfiguration="SessionServiceBehavior"> 

Nom du service est un nom de fichier de service Web à l'intérieur de l'application asp.net, il pointe vers SessionService.svc qui appartient à SessionWCF.Web ensemble (le même nom que projet).

En second lieu:

<%@ ServiceHost Language="C#" Debug="true" 
     Service="SessionWCF.Lib.SessionService" 
     CodeBehind="SessionWCF.Lib.SessionService.cs" %> 

service = est une méthode de fabrication qui obtient « type » du service pour créer, il faut aussi la description de la classe si CodeBehind = doit être indiqué dans le fichier SessionService.cs où la méthode d'usine peut Recherchez le type SessionService dans l'assembly SessionWCF.Lib.

mentionné deux déclarations ne sont pas la question parce que lorsque vous n'utilisez le scénario service d'état cela fonctionne comme un charme ...

Je crois que pour le service de l'Etat, il doit me configurer quelque chose de plus en web.config sont I » m manque quelque chose dans la description d'interface/classe dans la bibliothèque de classe de WCF ...

Je suis toujours dans la situation critique ...

Cordialement, Daniel Skowroński

MISE À JOUR

@marc_s vous avez écrit

I think you're wrong here on the SVC file - check out: msdn.microsoft.com/en-us/library/aa751792.aspx - the Service=".." attribute must be "The value of the Service attribute is the common language runtime (CLR) type name of the service implementation." - you need to specify the .NET name of the service implementation class here ! That's your SessionWCF.Lib.SessionService class.

Je suis d'accord avec vous becouse il est exacly ce que j'ai écrit :-)

Vous pointez cet article: http://msdn.microsoft.com/en-us/library/aa751792.aspx

Mais quelques lignes ci-dessous et vous verrez ce qu'il est sous le capot:

new ServiceHost(typeof(MyNamespace.MyServiceImplementationTypeName)); 

Alors, quand je dactylographiées:

<%@ ServiceHost Language="C#" Debug="true" 
     Service="SessionWCF.Lib.SessionService" 
     CodeBehind="SessionWCF.Lib.SessionService.cs" %> 

je l'ai souligné exacly: SessionWCF.Lib - espace de noms, SessionService - classe où j'ai mon service mis en œuvre.

Mon exemple SessionWCF.Lib - il s'agit à la fois du nom de l'assembly .dll et de l'espace de noms dans le projet SessionWCF.Lib que vous pouvez voir en haut de ce post lorsque je décris le deuxième projet dans ma solution. SessionWCF.Lib, il est ... »

Et encore cette solution fonctionne parfaitement sans fonctionnalité de session de WCF, mais il ne fonctionne pas quand j'utilise WCF session ce que je dois ...

Merci pour l'engagement, mais problème doit être ailleurs ...

MISE À JOUR 2010-07-08

@marc_s avait raison à propos d'une mauvaise configuration dans web.config.

Une configuration appropriée doit avoir être le même nom que dans WCF Bibliothèque:

<service behaviorConfiguration="SessionServiceBehavior" name="SessionWCF.Lib.SessionService"> 

Cordialement, Daniel Skowroński

+0

@marc_s J'ai mis à jour ma question. Cordialement, Daniel Skowroński –

+0

Hmm ... marc_s a supprimé toutes ses entrées ... –

+0

Quelqu'un peut-il m'aider avec ça? –

Répondre

0

@marc_s avait raison sur une mauvaise configuration dans web.config.

Une configuration appropriée doit avoir être le même nom que dans WCF Bibliothèque:

<service behaviorConfiguration="SessionServiceBehavior" name="SessionWCF.Lib.SessionService"> 
Questions connexes