2

私はWCFを初めて使用します。以前は、string、int32などの基本的なデータ型にWCFサービスを使用していましたが、BitmapImageクラスを使用しようとすると、テストクライアントで次のエラーが発生します。

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

交換BitmapImageするとString問題なく動作します。つまり、コードの一部が欠落しているということです。

理解を深めるために、ここに私のコードがあります。

WCFインターフェースコード

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace MyWcfService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        void MyMethod(MyDataContract obj);
    }

    [DataContract]
    public class MyDataContract
    {
        [DataMember]        
        public BitmapImage MyProperty { get; set; }
    }
}

WCFサービスコード

using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;
using System.Text;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace MyWcfService
{
    public class Service1 : IService1
    {
        public void MyMethod(MyDataContract obj)
        {
            //No code. It is blank.
        }
    }
}

Web.Configコード

  <system.serviceModel>
    <services>
      <service name="MyWcfService.Service1" behaviorConfiguration="MyWcfService.Service1Behavior">
        <!-- Service Endpoints -->
        <endpoint address="" binding="wsHttpBinding" contract="MyWcfService.IService1">
          <!-- 
              Upon deployment, the following identity element should be removed or replaced to reflect the 
              identity under which the deployed service runs.  If removed, WCF will infer an appropriate identity 
              automatically.
          -->
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyWcfService.Service1Behavior">
          <!-- 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>
  </system.serviceModel>
4

2 に答える 2

2

MyDataContractクラスにBitmapImageの KnownType を追加する必要があります。

[KnownType(typeof(BitmapImage))]
[DataContract]
    public class MyDataContract
    {
        [DataMember]        
        public BitmapImage MyProperty { get; set; }
    }

これは、string がプリミティブ型で BitmapImage がプリミティブ型ではないためです。そのため、シリアル化/逆シリアル化するときに処理するデータ型をコンパイラに「伝える」必要があります。

于 2012-10-07T18:19:38.930 に答える
2

私の推測では、BitmapImage は DataContractSerializer ( http://msdn.microsoft.com/en-us/library/ms731923.aspxを参照) でサポートされているタイプの 1 つではなく、データ コントラクトが無効になる (したがってメタデータが無効になる) と思います。生成に失敗し、投稿したエラー メッセージが表示されます)。

この場合、BitmapImage プロパティから [DataMember] を削除し、シリアル化を手動で処理する新しい [DataMember] プロパティを作成する必要があります (MyProperty を byte[] などのサポートされている型に変換します)。

于 2012-10-07T20:09:52.673 に答える