WCF Data Serviceとnet.tcpベアラ分析

6234 ワード

今日WCF Data Serviceがnet.tcpをサポートするIISサイトに配備された時に問題が発生し、関連資料を分析して検索することによっていくつか結論が出ました.
http://www.rajneeshnoonia.com/blog/2009/12/ria-wcf-configuration-finally-resolved/これはVSL 2008における初期バージョンであり、新しいVSL 2010は利用できない.
デフォルトのバインディングとビュー
フレームのデフォルトサポートのバインディングはweb.com figで設定されています.
<serviceHostingEvironment aspNetComptibilityEnbaled=「true」/>
        [AspNetCompatibilityRequirements(RequirementsMode = 
AspNetCompatibilityRequirementsMode.Allowed)]
IISの運行はWAS形式ではなく、Asp.netと混成する形式を採用していることが分かります.この場合、net.tcpをサポートするWCFサービスはIISに搭載できません.既存のバインディングのEndpointの配置情報をどうやって調べますか?
       DataServiceHostFactory   ,*.svc        ,                    
     
 //System.Data.Services.DataServiceHostFactory, System.Data.Services
       public class MyDataHostFactory : DataServiceHostFactory
       {
       protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType,Uri[] 
baseAddresses)
              {
                    return new MyDataServiceHost(serviceType, baseAddresses);
              }
       }
 
       public class MyDataServiceHost : DataServiceHost
       {
              //User to add custom logic here as desired
              public MyDataServiceHost(Type domainServiceType, params Uri[] baseAddresses)
                    : base(domainServiceType, baseAddresses)
              {
                    Debug.WriteLine("data svc");
              }
       }
       [AttributeUsage(AttributeTargets.Class)]
       public class MyServiceBehaviorAttribute : Attribute, IServiceBehavior
       {
       public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, 
Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
              {
              }
 
       public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
                     foreach (ServiceEndpoint endpoint in serviceHostBase.Description.Endpoints)
                    {
                           foreach (OperationDescription operation in endpoint.Contract.Operations)
                           {
                                  Debug.WriteLine(operation.Name);
                           }
                    }
              }
 
       public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
              {
              }
       }
       
       [MyServiceBehavior]
    public class NorthWindService : DataService< NorthwindEntities >
 
svcのサービスベアラを設定します.
<%@ ServiceHost Language="C#" Factory="DataServices.Web.Services.MyDataHostFactory" 
Service="DataServices.Web.Services.NorthWindService" %>
VSトラッキングでは、Endpointと対応するABC情報を見ることができます.もちろん、ここでいくつかのBehavior Bindingなどの情報を修正して、デフォルトの行動を変更して、カスタマイズを実現します.しかもカスタムもこれに限られています.Endpointのカスタマイズをしたいなら、次のセクションを参照してください.
以上のブレークポイントをDebug.WriteLineに設定すると、デフォルトで実現されたDataServiceHostのバインディングと契約は以下の通りになります.
Binding:WebHttp Binding
Contract:System.Data.Services.Irequest Handler
net.tcp分析を実現する
エラー現象
IISに展開すると、IISがnet.tcpをサポートする限り、次のようなエラーが発生します.
The provided URI scheme'net.tcp'is invalid;expected'http'.Parameter name:context.ListenUriBaseAddres
WCF DataServiceのデフォルト実装はTCPをサポートしていませんが、Silverlight 4は既にtcpプロトコルをサポートしていますので、この形式のサポートを追加する必要があります.次のバージョンは増加するかどうかは分かりません.
実際になぜTCPが必要ですか?
もし私たちがリモートをサポートし、ローカルネットワーク環境をサポートしながら、WCFSRサービスを利用して、WCF Data Serviceのように、データサービスを公開したいと思います.このようにデータのオペレータなどの文法とWCF Data Serviceが一致したら、サービスインターフェースについて多くの簡略化ができます.自分で繰り返し書きません.でないと、WCFの検索と操作方法は定義されます.そのtcpはLANにとってより良い選択です.
既存のコンポーネントを分析すると、どうすればいいか分かります.
System.Data.Services.dll:サービスのベアラとデフォルトのEndpointと属性の追加とHTTP要求処理を実現するHTTPModuleを含んでいます.これにより、要求されたHTTP要求が自動的にサービスに転送され、デフォルトで実現されたいくつかのクエリなどが直接使用できます.
System.Data.Services.Client.dll:         linq            WCF Data Service          
       System.Data.Services.Client.DataServiceContext
以上のように、両方が協力して、クライアントがカスタマイズ可能な各種のクエリと操作を実現しながら、サーバーは一つのフレームを通してサポートしています.重複コードを作成する必要はありません.net.tcpをサポートするつまりこれらのベースライブラリにEndpointを追加して、refrecttorを使って大体が見られますが、見積もりを実現するにはまだ大きな仕事量です.もし自分でフレームを書いたら、以上の二つのコンポーネントの考え方で処理すれば、WCF Data Service形式のサービスが実現できます.でも、これはフレームワークです.次のバージョンのWCF Data Serviceでこのようなサポートを提供してほしいです.
以上の追跡は、クライアント端末エージェントがLINQに基づいて伝達するHTTP要求を明確に見るために、Http Analyzerまたは他のツールを使用して詳細情報を調べることができる.
既存のソフトウェアはどうすればいいですか?
tcp形式のwcfサービスを展開している一方、WCF Data Serviceを使用したいプロジェクトに対して、一般的な可能な解決方法:
TCPサービスとhttpプロトコルのサービスをIISのルートアプリケーションに展開する.
wcf data serviceをルート下のサブアプリケーションに配置する.
参考:
http://social.msdn.microsoft.com/Forums/en-US/adodotnetdataservices/thread/d6388487-27c1-4023-9825-71fb50596a8f