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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Antwort für die erste Frage, die Sie finden können hier.
Bezug auf Fehler, die Sie bekommen - nicht Spalten-definition der Erweiterung in zwei Zeilen, da die xml-parser nicht verarbeiten kann, dass.
Muster, wie Sie benutzerdefinierte Kopfzeilen ohne Angabe Nachricht: Vertrag
Ich weiß, was das problem ist mit dem Verhalten nicht gefunden zu werden, und warum müssen Sie das hack mit dem Verhalten ohne Namen.
Wenn Sie sich diese Zeile in der svc-markup-Datei:
und diese Linie in Ihrem web.Config:
Beachten Sie, dass die angegebenen Namen in die service-tag-Nummer unterscheidet sich von der Service-Klasse angegeben, in der Service-Attribut im markup-Datei.
Ich denke, es sollte so etwas wie dieses:
statt
diese
Diese beiden Werte haben glaub ich den gleichen nicht sicher, aber in meinem Fall sind die beiden Werte unterschiedlich waren und ich hatte zu tun, das leere service-name hack. Aber wenn beide Werte die gleiche, es hat funktioniert. Er fand das Verhalten ohne die leere, und ich war in der Lage, Zugriff auf meine wsdl.