Вопрос

Это полностью функциональная программа WCF Hello World.То есть.Я могу запустить эту программу без каких-либо исключений.

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

namespace DataContractsNamespace
{
    [DataContract]
    public class AccountInfo
    {
        [DataMember]
        public string FirstName { get; set; }

        [DataMember]
        public string LastName { get; set; }
    }
}

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

namespace Clients
{
    public class BankProxy : ServiceContractsNamespace.IBank
    {
        ServiceContractsNamespace.IBank channel;

        public BankProxy()
        {
            channel = ChannelFactory<ServiceContractsNamespace.IBank>.CreateChannel(new BasicHttpBinding(), new EndpointAddress("http://localhost:8000/Services/BankService"));
        }

        public decimal GetAcccountBalance(string AcctNo)
        {
           return channel.GetAcccountBalance(AcctNo);
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
             return channel.GetAccountInfo(AcctNo);
        }
    }
}

using System;
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;

namespace ServiceContractsNamespace
{
    [ServiceContract]
    public interface IBank
    {
        [OperationContract]
        decimal GetAcccountBalance(string AcctNo);

        [OperationContract]
        DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo);
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Clients
{
    class Program
    {
        static void Main(string[] args)
        {
            BankProxy prox = new BankProxy();
            Console.WriteLine("Hit enter to invoke the service call. Type exit then enter to close");

            while (Console.ReadLine() != "exit")
            {
                string balance = prox.GetAcccountBalance("1234").ToString("c");
                DataContractsNamespace.AccountInfo ai = prox.GetAccountInfo("1234");
                Console.WriteLine("{0} {1} your account balance is {2}.", ai.FirstName, ai.LastName, balance);
            }
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hosts
{
    public class BankService : ServiceContractsNamespace.IBank
    {
        public decimal GetAcccountBalance(string AcctNo)
        {
            return 1.37m;
        }

        public DataContractsNamespace.AccountInfo GetAccountInfo(string AcctNo)
        {
            DataContractsNamespace.AccountInfo ai = new DataContractsNamespace.AccountInfo();
            ai.FirstName = "Paul";
            ai.LastName = "Johansen";
            return ai;
        }
    }
}

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

namespace Hosts
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost servHo = new ServiceHost(typeof(BankService), new Uri("http://localhost:8000/Services"));
            servHo.AddServiceEndpoint(typeof(ServiceContractsNamespace.IBank), new BasicHttpBinding(), "BankService");

            servHo.Open();
            Console.WriteLine("This service is open for business. Hit Enter to close.");
            Console.ReadLine();
            servHo.Close();
        }
    }
}

Как вы можете видеть, контракт AccountInfo - Data совместно используется как Клиентом, так и Хостом.

Мне нужно сохранить контракт на передачу данных только на стороне хостинга / Сервиса.

Клиенты должны видеть только интерфейсы DataContracts (например IAccountInfo).

Как я должен изменить свою программу, чтобы внедрить IAccountInfo?

Это было полезно?

Решение

Похоже, вы хотите вернуть интерфейс вместо класса.Я не совсем понимаю, почему вы не согласны вернуть AccountInfo.Тем не менее, вы должны быть в состоянии сделать это, но вам нужно будет использовать Известный тип или, возможно, ServiceKnownType, чтобы заставить его работать.

В качестве альтернативы, если вы работаете в полностью .СЕТЕВОЙ среде, вы можете использовать NetDataContractSerializer - сервер NetDataContractSerializer вместо DataContractSerializer.

Для получения справочных материалов и примеров вы можете ознакомиться здесь:

Другие советы

А что IBank.GetAccountInfo должен вернуть клиенту, если вы не хотите делиться AccountInfo? создать 2 класса, сделать первый datacontract второй нет, и где вы хотите поделиться, используйте первый, а где нет, второй

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top