0

WCF サービスが正常に動作するという問題があります。二重サービスを作成しようとしていますが、カスタム データ型を返そうとするたびに、クライアント側が壊れます。

GetTestData を削除すると、すべて正常に動作します。追加すると、クライアント側ですべてが壊れます。「参照されたアセンブリで型を再利用する」のチェックを外すことで修正できるようですが、これを行うことで悪影響があるかどうかはわかりません。

ここにコードがあります

ITestService.cs

namespace MyApp.Server
{
    [ServiceContract(Namespace = "http://www.mysite.net", CallbackContract = typeof(IDuplexTestClient))]
    public interface ITestService
    {
        [OperationContract]
        string Hello();

        [OperationContract]
        TestData GetTestData();
    }

    public interface IDuplexTestClient
    {
        [OperationContract(IsOneWay = true)]
        void TestCallback(string message);
    }
}

TestService.cs

namespace MyApp.Server
{
    [ServiceBehavior(Namespace = "http://www.mysite.net")]
    public class TestService : ITestService, ICrossDomainPolicyResponder
    {
        public string Hello()
        {
            return "Hello";
        }

        public TestData GetTestData()
        {
            return new TestData();
        }

        #region ICrossDomainPolicyResponder Members
        public Stream GetSilverlightPolicy()
        {
            string result = @"<?xml version=""1.0"" encoding=""utf-8""?>
                <access-policy>
                    <cross-domain-access>
                        <policy>
                            <allow-from http-request-headers=""*"">
                                <domain uri=""*""/>
                            </allow-from>
                            <grant-to>
                                <resource path=""/"" include-subpaths=""true""/>
                            </grant-to>
                        </policy>
                    </cross-domain-access>
                </access-policy>";
            return StringToStream(result);

        }

        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0""?>
                            <!DOCTYPE cross-domain-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
                            <cross-domain-policy>
                                <allow-access-from domain=""*"" />
                            </cross-domain-policy>";
            return StringToStream(result);
        }

        private Stream StringToStream(string result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        #endregion
    }
}

TestData.cs

namespace MyApp.SDK 
{
    [DataContract(Namespace = "http://www.mysite.net")]
    public class TestData
    {
        [DataMember]
        public string TestString { get; set; }
    }
}
4

2 に答える 2

0

タイプTestDataはサーバー側で宣言されます。

クライアントがTestDataを返すサービスを使用するには、TestDataがどのように見えるかを知っている必要があります。

これは、サービス参照の追加を行うときに設定されます。

それを行うには2つの方法があります。

  • クライアントには、TestDataを含むdllへの参照があります
  • Add Service Referenceは、クライアントでタイプを生成します

「参照されるアセンブリでタイプを再利用する」は、最初のオプションを使用することを示しています。

それを行う「正しい」方法はありません。クライアントとサーバーを制御できる場合は、dllを再利用できるため、タイプが変更されたときにサービス参照を更新する必要はありません。

于 2012-04-19T21:10:57.840 に答える
0

ここで何が起こっているのかまだ100%わかりませんが、自分に合った解決策を見つけました。「指定された参照アセンブリでタイプを再利用する」を使用して、必要な機能を取得できます。これで問題は修正されましたが、クライアントとサーバー間でMyApp.SDKクラスを共有できます。

于 2012-04-20T19:56:38.613 に答える