2010-06-23 3 views
1

У меня есть необходимость размещения службы WCF с использованием механизма сеанса WCF.Служба сеанса WCF, размещенная в приложении ASP.NET MVC 2.0

Я прочитал http://msdn.microsoft.com/en-us/library/ms733040.aspx но не хватает ...

Мой простой scenearion:

У меня есть решение с 4-х проектов.

Первый - SessionWCF.Base, это простая библиотека классов, которая содержит базовый интерфейс IServiceBase для моей службы.

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(); 
    } 
} 

Второй - SessionWCF.Lib, это библиотеки классов WCF, которая содержит интерфейс службы ISessionService и класс обслуживания SessionService, имеет проект ссылку 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 
    } 
} 

Третье - это SessionWCF.Web Приложение ASP.NET MVC 2.0, содержащее файл SessionService.svc. Я удалил код и открыл редактор XML, эта служба указана на службу из SessionWCF.Lib, и, конечно, этот проект имеет ссылку на 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> 

Четвертый - SessionWCF.WPF это стандартное приложение WPF, что contanins класс SessionProxy и в XAML случае форма мыши для вызова веб-службы , Этот проект имеет ссылку на проект для первой сессии SessionWCF.Base.

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(); 
     } 
    } 
} 

Нажмите событие в виде 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; 
     } 

Сейчас:

Когда я звоню веб-службы в веб-браузере я получить следующее сообщение об ошибке:

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 

Когда я называю это в моем случае XAML я ServiceActivationException:

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

Это неправильная конфигурация в web.config? Возможно, мне что-то не хватает в атрибутах обслуживания? И самое главное. Почему он предупреждает меня о BasicHttpBinding, когда я его не использую ???

Любой может мне помочь в этом, пожалуйста? Это важно для моего текущего проекта ...

С уважением, Daniel Skowronski

UPDATE:

@marc_s

Во-первых:

Я думаю, что на стороне сервера неправильно, потому что, когда я просто вставить URL «HTTP : //**********/SessionWCF/SessionService.svc 'в любом веб-браузере Я получу ошибку «Контракт требует сеанса, но Bind «BasicHttpBinding» не поддерживает его или неправильно настроен для его поддержки. "Вместо того, чтобы метаданные ...

Во-вторых:

В моем клиенте WPF приложения Я всегда два варианта:

Первый - Создание ссылки на службу и IDE будет автоматически генерировать прокси-класс и добавить все настройки в приложении. конфиг

Здесь я не могу этого сделать, потому что я получаю ту же ошибку, что и в веб-браузере, когда я указываю на веб-службы в Service Reference дизайнера

Второй -.. Создание никудышный вручную и приложение связывания с onfiguration из кода, это дает мне возможность создать прокси-шаг за шагом, но мне кажется, что ServiceActivationException это та же проблема «ВКЛЮЧЕНИЕ», вы можете увидеть в стеке проследить эти строки:

[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 

С уважением, Daniel Skowronski

UPDATE:

@marc_s

Я не это именно так, потому что:

Во-первых:

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

Имя службы это имя файла веб-службы внутри приложения ASP.NET, так что указывает на SessionService.svc который принадлежит SessionWCF.Web сборки (то же имя, как проект).

Во-вторых:

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

Service = это фабричный метод, который получает «тип» сервиса для создания, он также нуждается в описании класса так CodeBehind = должен быть указан SessionService.cs файл где фабричный метод может найдите тип SessionService внутри сборки SessionWCF.Lib.

Указанные два утверждения не проблема, потому что когда вы не используете сценарий службы состояний это работает как шарм ...

Я считаю, что для государственной службы он должен мне установить что-то больше в web.config есть я m отсутствует что-то в описании интерфейса/класса в библиотеке классов WCF ...

Я все еще в критическом положении ...

С уважением, Daniel Skowronski

UPDATE

@marc_s Вы писали

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.

Я согласен с вами becouse это exacly то, что я написал :-)

Вы указываете эту статью: http://msdn.microsoft.com/en-us/library/aa751792.aspx

Но несколько строк ниже, и вы увидите, что он находится под капотом:

new ServiceHost(typeof(MyNamespace.MyServiceImplementationTypeName)); 

Так что, когда я напечатал:

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

Я указал exacly: SessionWCF.Lib - пространство имен, SessionService - класс, где у меня есть моя служба.

Я мой пример SessionWCF.Lib - это имя сборки для .dll и пространства имен внутри SessionWCF.Lib проекта, что вы можете видеть в верхней части этого сообщения, когда я описываю второй проект в своем решении, начиная с «Second - SessionWCF.Lib, это ...»

И снова это решение отлично работает без функциональности Session ФОС, но она не работает, когда я использую WCF сессию, что мне нужно ...

Спасибо за зацепление, но выпуск должен быть в другом месте ...

UPDATE 2010-07-08

@marc_s был прав о неправильной конфигурации в web.config.

Правильная конфигурация должна иметь такой же имя, как и в ФОС библиотеке:

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

С уважением, Daniel Skowronski

+0

@marc_s Я обновил мой вопрос. С наилучшими пожеланиями, Даниэль Скоуровски –

+0

Хмм ... marc_s удалил все свои записи ... –

+0

Может ли кто-нибудь мне помочь? –

ответ

0

@marc_s был прав о неправильной конфигурации в файле web.config.

Правильная конфигурация должна иметь такой же имя, как и в ФОС библиотеке:

<service behaviorConfiguration="SessionServiceBehavior" name="SessionWCF.Lib.SessionService"> 
Смежные вопросы