Перемещение данных по контрактам WCF
-
07-07-2019 - |
Вопрос
Это полностью функциональная программа 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 второй нет, и где вы хотите поделиться, используйте первый, а где нет, второй