2011-12-13 13 views
2

私は最初のWCFサービスを作ろうとしています。 私は問題があります - 私は構造体、クラス、およびいくつかのメソッドを書いています。 私のサービス契約は、次のようになります。私は、Visual Studioでテストクライアントを使用して、それを実行するとwcfサービスが動作していません - サービスを追加できませんでした

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.ServiceModel; 
using System.Text; 

namespace WebshopReports 
{ 
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the interface name "IReports" in both code and config file together. 
    [ServiceContract] 
    public interface IReports 
    { 
     [OperationContract] 
     List<Category> getReportCategories(string dir); 

     [OperationContract] 
     List<CReport> getReportList(Category category); 

    } 
} 

は、私は次を得る:

は、サービスの追加に失敗しました。サービスメタデータにアクセスできない可能性があります。 サービスを実行し、メタデータが公開されていることを確認してください。

私はweb.configファイルと関係があると確信しています。それは以下の通りです。私はweb.configファイルを設定する方法がわからないよと誰かが私を助けてくださいすることができます

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 
    <system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="false"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
    </system.serviceModel> 
<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

奇妙なことは、私はクラスから構造体へのCReportを変更した場合、それが動作しますです。

答えて

0

CReportがシリアライズ可能であることを確認する必要があります。そうしないと、WCFが(あなたのケースではWSDLを介して)サービスを交換するためのメタデータを作成できなくなります。あなたのCReportクラスにDataContract属性を追加して読んでください。サーバー側で

1)シリアル:

私たちの経験では
+0

おそらく私は私の解決策を間違った方法で探しています。パラメータを受け取り、クリスタルレポートを実行してデータを返すサービスを作成したいと考えています。これについてはWSDLサービスが最善の方法でしょうか? – Lock

+0

これについてはさまざまな方法があります。ウェブサービスが適切なソリューションであるかどうかを判断するためには、制約を評価する必要があります。私はあなたに決定的な答えを与えるためのあなたの必要条件について十分に分かっていません - それはあなたの元の質問の範囲外です。 –

1

、このタイプの障害の二つの主要な原因があります。これは、シリアライズ可能でないクラス、またはKnownType属性を使用せずに抽象クラスをシリアライズしようとすることが原因です。

2)WCFが同じ総称シグネチャを持つ複数のコレクション型またはディクショナリ型クラス間で混乱するため、クライアント側でのシリアライズ。

あなたの説明に基づいて、問題1がアイテム1のように聞こえます。

このようなWCFの問題のトラブルシューティングを行うための最善の方法は、あなたのweb.configファイルの構成セクションに次のブロックを追加することです:あなたがインターフェイスを使用しようと、それが失敗したら

<system.diagnostics> 
    <sources> 
     <source name="System.ServiceModel" 
       switchValue="Information, ActivityTracing" 
       propagateActivity="true"> 
     <listeners> 
      <add name="traceListener" 
       type="System.Diagnostics.XmlWriterTraceListener" 
       initializeData="c:\log\WebTrace.svclog" /> 
     </listeners> 
     </source> 
    </sources> 
    </system.diagnostics> 

、ダブルsvclogファイルをクリックすると、WCFのログビューアツールが開きます。発生した例外はすべて赤で強調表示され、ドリルダウンしてWCFサービスが失敗する特定の問題を確認できます。

0

CReportをシリアライズ可能とマークしたことを再度確認します。これにより、WCFシリアライザはWCFメタデータのクラス定義を公開できます。

0

私は間違っていない場合。私はあなたの設定で任意のサービスノードを見つけることができません。 あなたが設定ファイルに

<configuration> 
     <System.ServiceModel> 
     <Services> 
     <Service name="YourService.Somthing"> 
     <EndPoint name="default" address="" binding="basicHttpBinding" bindingConfiguration="" contract="YourContrat.Something"></Endpoint> 
     <endpoint kind="mexEndpoint" address="/mex" /> 
     </Service> 
     </Services> 
<System.ServiceModel> 
</configuration> 

希望をこのような何かをinludeする必要があり、これは役立ちます。

ありがとうございました

1

私のウェブを見てください。設定、私はあなたの設定ファイルが間違っていると思います:

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="NoneSecurity" 
      maxBufferPoolSize="12000000" maxReceivedMessageSize="12000000" useDefaultWebProxy="false"> 
      <readerQuotas maxStringContentLength="12000000" maxArrayLength="12000000"/> 
      <security mode="None"/> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="Elong.GlobalHotel.Host.IHotelAPIBehavior" 
     name="Elong.GlobalHotel.Host.IHotelAPI"> 
     <endpoint address="" binding="wsHttpBinding" bindingConfiguration="NoneSecurity" contract="Elong.GlobalHotel.Host.IIHotelAPI"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="Elong.GlobalHotel.Host.IHotelAPIBehavior"> 
      <serviceMetadata httpGetEnabled="true" /> 
      <serviceDebug includeExceptionDetailInFaults="false" /> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
関連する問題