WCF Konstruktor mit parameter / Verhalten Im Code Erstellt

Habe ich ein müssen zum erstellen von wcf-service mit parameter.

Ich bin nach dieser http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/8f18aed8-8e34-48ea-b8be-6c29ac3b4f41

Erste ist, dass ich nicht weiß, wie kann ich diese benutzerdefinierte Verhalten "MyServiceBehavior" in meinem Web.config in ASP.NET MVC-Anwendung, host-it.

Soweit ich weiß Verhaltensweisen deklariert werden müssen, im Abschnitt in der wcf.config.
Wie kann ich Verweis hinzufügen es zu meinem Verhalten-Klasse von service Montage?

Eine zweite Sache ist, dass in dem folgenden Beispiel, das Sie erstellt haben lokalen host (Sie verwenden

ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));

host in der Konsole-Anwendung), aber wie kann ich add Header

OperationContext.Current.OutgoingMessageHeaders.Add ...

initialisiert der Konstruktor verwenden, wenn ich in meinem WPF-client-Anwendung service-Referenz und wird es schon schaffen-Instanz von web-service - "client" - Klasse

PBSDataCacheSyncContractClient client = new PBSDataCacheSyncContractClient();

ist es nicht zu spät ist? Oder wenn ich mein eigenes Verhalten kann ich tun so etwas wie dieses:

PBSDataCacheSyncContractClient client = new PBSDataCacheSyncContractClient(my var for service constructor) ?

Grüße,
Daniel Skowroński

EDIT: 31-05-2010

@manunt

Habe ich verbesserte meine zweite Frage.

Für die Antwort auf meine erste Frage, ich habe es geschafft, erstellen Sie benutzerdefinierte Erweiterung, aber ich kann nicht zu registrieren.

Mein Szenario:

  • Ich habe Definitionen für meine web-service in der WCF-Bibliothek (Schnittstelle, den Vertrag, die Umsetzung der IInstanceProvider, BehaviorExtensionElement)
  • ich dann verweisen Sie auf ein anderes Projekt ASP.NET Anwendung
  • innen ASP.NET Anwendung ich habe die WCF-Dienst-Datei und es wird gezeigt, meiner Klasse von WCF-Bibliothek
  • alle meine Konfiguration erklärt wird, im web.config

In meinem WCF-library habe ich:

namespace PBS.SyncService
{
using System;
using System.Data;
using System.Collections.ObjectModel;
using System.ServiceModel;
using Microsoft.Synchronization.Data;
using System.ServiceModel.Activation;
using Microsoft.Synchronization.Data.Server;
using System.Data.SqlClient;
using System.Collections.Generic;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Configuration;

[XmlSerializerFormat()]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public partial class PBSDataCacheSyncService : object, IPBSDataCacheSyncContract
{

    private PBSDataCacheServerSyncProvider _serverSyncProvider;

    public PBSDataCacheSyncService()
    {
        this._serverSyncProvider = new PBSDataCacheServerSyncProvider();
    }

    public PBSDataCacheSyncService(long doctorId)
    {
        this._serverSyncProvider = new PBSDataCacheServerSyncProvider();
        this._serverSyncProvider.DoctorId = doctorId;
        this._serverSyncProvider.InitializeCustomSyncProvider();
    }

    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public virtual SyncContext ApplyChanges(Microsoft.Synchronization.Data.SyncGroupMetadata groupMetadata, DataSet dataSet, Microsoft.Synchronization.Data.SyncSession syncSession)
    {
        return this._serverSyncProvider.ApplyChanges(groupMetadata, dataSet, syncSession);
    }

    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public virtual SyncContext GetChanges(Microsoft.Synchronization.Data.SyncGroupMetadata groupMetadata, Microsoft.Synchronization.Data.SyncSession syncSession)
    {
        return this._serverSyncProvider.GetChanges(groupMetadata, syncSession);
    }

    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public virtual SyncSchema GetSchema(Collection<string> tableNames, Microsoft.Synchronization.Data.SyncSession syncSession)
    {
        return this._serverSyncProvider.GetSchema(tableNames, syncSession);
    }

    [System.Diagnostics.DebuggerNonUserCodeAttribute()]
    public virtual SyncServerInfo GetServerInfo(Microsoft.Synchronization.Data.SyncSession syncSession)
    {
        return this._serverSyncProvider.GetServerInfo(syncSession);
    }

    public bool InitializeCustomSyncProvider(long doctorId)
    {
        this._serverSyncProvider.DoctorId = doctorId;
        return this._serverSyncProvider.InitializeCustomSyncProvider();
    }
}

[XmlSerializerFormat()]
[ServiceContractAttribute()]
public interface IPBSDataCacheSyncContract
{

    [OperationContract()]
    SyncContext ApplyChanges(Microsoft.Synchronization.Data.SyncGroupMetadata groupMetadata, DataSet dataSet, Microsoft.Synchronization.Data.SyncSession syncSession);

    [OperationContract()]
    SyncContext GetChanges(Microsoft.Synchronization.Data.SyncGroupMetadata groupMetadata, Microsoft.Synchronization.Data.SyncSession syncSession);

    [OperationContract()]
    SyncSchema GetSchema(Collection<string> tableNames, Microsoft.Synchronization.Data.SyncSession syncSession);

    [OperationContract()]
    SyncServerInfo GetServerInfo(Microsoft.Synchronization.Data.SyncSession syncSession);

    [OperationContract()]
    bool InitializeCustomSyncProvider(long doctorId);

    [OperationContract()]
    string[] GetSyncAdapterInfo();
}

public class PBSDataCacheSyncProvider : IInstanceProvider
{
    public object GetInstance(InstanceContext instanceContext, Message message)
    {
        string doctorId = message.Headers.GetHeader<string>("DoctorId", "http://***/SyncService.svc");
        if (doctorId != null)
        {
            return new PBSDataCacheSyncService(Convert.ToInt64(doctorId));
        }
        else
        {
            return new PBSDataCacheSyncService();
        }
    }
    public object GetInstance(InstanceContext instanceContext)
    {
        return new PBSDataCacheSyncService();
    }
    public void ReleaseInstance(InstanceContext instanceContext, object instance)
    {
    }
}

public class PBSDataCacheSyncBehavior : BehaviorExtensionElement, IServiceBehavior
{
    PBSDataCacheSyncProvider pbsProvider = new PBSDataCacheSyncProvider();
    public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters) { }
    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                ed.DispatchRuntime.InstanceProvider = this.pbsProvider;
            }
        }
    }
    public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { }

    public override Type BehaviorType
    {
        get { return typeof(PBSDataCacheSyncBehavior); }
    }

    protected override object CreateBehavior()
    {
        return new PBSDataCacheSyncBehavior();
    }
}
}

Mein WCF-Dienst-Datei hat den Namen: SyncService.svc und in meinem makrup ich habe:

<%@ ServiceHost Language="C#" Debug="true" Service="PBS.SyncService.PBSDataCacheSyncService" CodeBehind="PBS.SyncService.PBSDataCache.Server.SyncContract.cs" %>

Meine web.config:

<service name="PBS.Web.SyncService" behaviorConfiguration="behPBSDataCacheSyncBehavior">
    <host>
      <baseAddresses>
        <add baseAddress="http://***/SyncService.svc" />
      </baseAddresses>
    </host>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <endpoint address=""  binding="basicHttpBinding" contract="PBS.SyncService.IPBSDataCacheSyncContract" />
</service>

<serviceBehaviors>
    <behavior name="behPBSDataCacheSyncBehavior">
      <PBSDataCacheSyncBehavior /> <!-- this element is being ignored -->
    </behavior> 
</serviceBehaviors>

<extensions>
    <behaviorExtensions>
        <add name="PBSDataCacheSyncBehavior" type="PBS.SyncService.PBSDataCacheSyncBehavior, PBS.SyncService,
            Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    </behaviorExtensions>
</extensions>

Können Sie mir sagen, was ich bin fehlt in diesem Punkt?
Warum parser ignoriert meine custom extension-Deklaration?

Habe ich folgende Fehler:

Konfiguration Fehler
Beschreibung: Fehler während der Verarbeitung einer Konfigurationsdatei für diese Anforderung erforderlich. Bitte überprüfen Sie die folgenden spezifischen Fehlerdetails, und ändern Sie die Konfigurationsdatei entsprechend.

Parser-Fehlermeldung: Fehler beim erstellen des konfigurationsabschnittshandlers für system.serviceModel/Verhalten: Extension-element 'PBSDataCacheSyncBehavior' kann nicht Hinzugefügt werden, um diese element. Stellen Sie sicher, dass die Erweiterung registriert ist, ist in der extension collection aus dem system.serviceModel/extensions/behaviorExtensions.
Parameter name: element

EDIT: 01-06-2010

Problem mit parser behoben, indem Sie die Erklärung in einer einzigen Zeile.

Weiß ich noch nicht, wie Sie header hinzufügen, wenn ich die service Referenz.

In meiner WPF-Anwendung ich habe nur die client-Instanz Hexe implementiert meinem IPBSDataCacheSyncContract automatisch generierte durch die Service-Referenz.

Und wenn ich es initialisieren, es hat nur Konstruktoren:

öffentlichen PBSDataCacheSyncContractClient() {
}

    public PBSDataCacheSyncContractClient(string endpointConfigurationName) : 
            base(endpointConfigurationName) {
    }

    public PBSDataCacheSyncContractClient(string endpointConfigurationName, string remoteAddress) : 
            base(endpointConfigurationName, remoteAddress) {
    }

    public PBSDataCacheSyncContractClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(endpointConfigurationName, remoteAddress) {
    }

    public PBSDataCacheSyncContractClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) : 
            base(binding, remoteAddress) {
    }

Wo kann ich add Header?

"Als für die zweite Frage - sollten Sie definieren message-Vertrag mit der erforderlichen Headern und bieten header-Werte für jede Nachricht einzeln." Konnte Sie sein spezifischer?

EDIT: 02-06-2010

Ich habe festgestellt andere Frage.

Wenn ich jetzt meine Konfiguration httpGetEnabled ignoriert... :

<serviceBehaviors>
    <behavior name="behPBSDataCacheSyncBehavior">
      <PBSDataCacheSyncBehavior />
      <serviceMetadata httpGetEnabled="true" /><!-- ignored -->
      <serviceDebug includeExceptionDetailInFaults="true" /><!-- ignored -->
    </behavior> 
</serviceBehaviors>

Wie kann ich es beheben?

EDIT: 02-06-2010

OK ich habe herausgefunden Abhilfe. Es ist immer noch komisch, aber es funktioniert!

War mein problem mit web.config. Und keine Namen Verhalten Eintrag ist anerkannt durch meinen Dienst, und nicht irgendwelche anderen... Also added mich einfach no-name-Verhalten-Sammlung.

<serviceBehaviors>
    <behavior name="">
        <PBSDataCacheSyncBehavior />
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior> 
    <behavior name="behPBSDataCacheSyncBehavior">
        <PBSDataCacheSyncBehavior />
        <serviceMetadata httpGetEnabled="true" />
        <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior> 
</serviceBehaviors>

Und ich add header in meinem code auf diese Weise:

int doctorId = 2;

Sync.PBSDataCacheSyncContractClient client = new Sync.PBSDataCacheSyncContractClient();
new OperationContextScope (client.InnerChannel);
OperationContext.Current.OutgoingMessageHeaders.Add(
MessageHeader.CreateHeader("DoctorId", "http://***/SyncService.svc", doctorId));

Ich habe Thema geändert, um nützlicher zu sein.

HTH

Grüße,
Daniel Skowroński

Schreibe einen Kommentar