2011-12-09 11 views
4

私は、私たちのサイトの資産を作成し、管理するための方法がたくさんあるサービスを持っています。また、外部からアクセスできる必要がある2つのメソッドがあります。「GetConfiguration」と「GetElement」と言うことができます。私は別のServiceContractsを使用して異なるエンドポイントで同じサービスを公開したいと思います。しかし、私はこれらの2つのメソッドを両方のエンドポイントで利用できるようにしたい。WCFサービスでは、特定のメソッドのみにアクセスできる第2のエンドポイントを公開するにはどうすればよいですか?

は、ここに私のApp.configファイルの該当するセクションです:

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.InvalidOperationException: An exception was thrown in a call to a WSDL export extension: System.ServiceModel.Description.DataContractSerializerOperationBehavior 
contract: http://tempuri.org/:IPublicManager ----> System.InvalidOperationException: The Manager.IPublicManager.GetConfiguration operation references a message element [http://tempuri.org/:GetConfiguration] that has already been exported from the Manager.IManager.GetConfiguration operation. You can change the name of one of the operations by changing the method name or using the Name property of OperationContractAttribute. Alternatively, you can control the element name in greater detail using the MessageContract programming model. 
at System.ServiceModel.Description.MessageContractExporter.AddElementToSchema(XmlSchemaElement element, String elementNs, XmlSchemaSet schemaSet) 
at System.ServiceModel.Description.MessageContractExporter.ExportWrappedPart(Message message, String elementName, String elementNs, XmlSchemaSet schemaSet, Boolean skipSchemaExport) 
at System.ServiceModel.Description.DataContractSerializerMessageContractExporter.ExportBody(Int32 messageIndex, Object state) 
at System.ServiceModel.Description.MessageContractExporter.ExportMessage(Int32 messageIndex, Object state) 
at System.ServiceModel.Description.MessageContractExporter.ExportMessageContract() 
at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension) 
--- End of inner ExceptionDetail stack trace --- 
at System.ServiceModel.Description.WsdlExporter.CallExtension(WsdlContractConversionContext contractContext, IWsdlExportExtension extension) 
at System.ServiceModel.Description.WsdlExporter.CallExportContract(WsdlContractConversionContext contractContext) 
at System.ServiceModel.Description.WsdlExporter.ExportContract(ContractDescription contract) 
at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName) 
at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName) 
at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
at SyncInvokeGet(Object , Object[] , Object[]) 
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

だから、それはdoesnの:

<service name="Manager.Manager" behaviorConfiguration="Manager.ManagerBehavior"> 
    <endpoint address="" binding="customBinding" bindingConfiguration="NetHttpBinding" contract="Manager.IManager" /> 
    <endpoint address="Runtime" binding="customBinding" bindingConfiguration="NetHttpBinding" contract="Manager.IPublicManager" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    </service> 

私はIISにこの事をロードし、それをアクセスしようと、私は次のエラーを取得しますオペレーションが同じ名前を持つようには思えません。何か案は?どちらも同じServiceクラスを使用します。たぶん私はちょうど間違った方法で完全に問題に近づいていますか?

答えて

1

これはあなたの問題を正確に解決するわけではありませんが、何か助けになると思います。私はそれに最も慣れているのでwebHttpBindingを使用します。

ここでの考え方は、2つの別々のインターフェイスに、パブリックとプライベートの機能を分割することです:あなたが見ることができるようにサービスが両方として公開可能であることをIPrivateを実装する理由IPrivateの実装もIPublicを実装する必要があり

[ServiceContract] 
public interface IPrivate : IPublic 
{ 
    [WebGet(UriTemplate = "/admin")] 
    [OperationContract] 
    int PrivateStuff(); 
} 

[ServiceContract] 
public interface IPublic 
{ 
    [WebGet(UriTemplate = "/common")] 
    [OperationContract] 
    int PublicStuff(); 
} 

サービスの実装は、現在両方IPublicIPrivateとして公開することができ、エンドポイントはサービス(「service1.svc」)の下にさらすことができる。それは国民の中で

<system.serviceModel> 
     <behaviors> 
     <serviceBehaviors> 
      <behavior> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="rest"> 
      <webHttp/> 
      </behavior> 
     </endpointBehaviors> 
     </behaviors> 
     <services> 
     <service name="ManagerService.Service"> 
      <endpoint address="private" behaviorConfiguration="rest" contract="ManagerService.IPrivate" binding="webHttpBinding"/> 
      <endpoint address="public" behaviorConfiguration="rest" contract="ManagerService.IPublic" binding="webHttpBinding" /> 
      <endpoint address="/private/mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      <endpoint address="/public/mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
     </services> 

サービスは現在公開されてhttp://host/service1.svc/commonの部分ですが、プライベートバージョンは公開されていますhttp://host/service1.svc/admin

メタデータの交換は正しく動作していないようですが、おそらくバインディングの種類が原因です。

0

1)サービスコントラクトアトリビュートを持つ2つのinterface/contractを作成します。 2)両方のサービス契約を実装します。 3)サービスは同じですが、エンドポイントを作成して別の契約名(インタフェース)を記述してください。詳細については

リンク

https://www.safaribooksonline.com/library/view/learning-wcf/9780596101626/ch01s07.html

と思います参照してください。