ChannelFactory<T>
có phương thức ảo CreateChannel()
. Nếu điều này không được ghi đè, nó sẽ sử dụng tạo mã động, không thành công trên MonoTouch.
Giải pháp là ghi đè và cung cấp triển khai biên dịch của riêng bạn.
Dưới đây là một triển khai dịch vụ cũ của tôi mà ít nhất được sử dụng để làm việc trên MonoTouch. Tôi chia nó thành 2 lớp học một phần - lớp đầu tiên được liên kết trong tất cả các bản dựng, thứ 2 chỉ trong bản dựng iOS (cho phép cơ chế tạo động vẫn hoạt động trên các cửa sổ).
Tôi đã gỡ xuống để chỉ chứa 1 cuộc gọi dịch vụ.
TransactionService.cs:
public partial class TransactionService : ClientBase<IConsumerService>, IConsumerService
{
public TransactionService()
{
}
public TransactionService(string endpointConfigurationName) :
base(endpointConfigurationName)
{
}
public TransactionService(string endpointConfigurationName, string remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public TransactionService(string endpointConfigurationName, EndpointAddress remoteAddress) :
base(endpointConfigurationName, remoteAddress)
{
}
public TransactionService(Binding binding, EndpointAddress remoteAddress) :
base(binding, remoteAddress)
{
}
public AccountBalanceResponse GetAccountBalance(AccountBalanceQuery query)
{
return Channel.GetAccountBalance(query);
}
}
TransactionService.iOS.cs: ConsumerServiceClientChannel
mà thực hiện các cuộc gọi thông qua phản ánh)
public partial class TransactionService
{
protected override IConsumerService CreateChannel()
{
return new ConsumerServiceClientChannel(this);
}
private class ConsumerServiceClientChannel : ChannelBase<IConsumerService>, IConsumerService
{
public ConsumerServiceClientChannel(System.ServiceModel.ClientBase<IConsumerService> client) :
base(client)
{
}
// Sync version
public AccountBalanceResponse GetAccountBalance(AccountBalanceQuery query)
{
object[] _args = new object[1];
_args[0] = query;
return (AccountBalanceResponse)base.Invoke("GetAccountBalance", _args);
}
// Async version
public IAsyncResult BeginGetAccountBalance(AccountBalanceQuery query, AsyncCallback callback, object asyncState)
{
object[] _args = new object[1];
_args[0] = query;
return (IAsyncResult)base.BeginInvoke("GetAccountBalance", _args, callback, asyncState);
}
public AccountBalanceResponse EndGetAccountBalance(IAsyncResult asyncResult)
{
object[] _args = new object[0];
return (AccountBalanceResponse)base.EndInvoke("GetAccountBalance", _args, asyncResult);
}
}
}
EDIT: Tôi chỉ được thử nghiệm này với các mới nhất MT (5.2) - nó không còn cần tất cả các tấm nồi hơi mà tôi đã có trong đó trước đây, chỉ cần ghi đè CreateChannel(). Tôi đã làm sạch mã mẫu để khớp.
EDIT2: Tôi đã thêm triển khai phương pháp không đồng bộ.
cảm ơn bạn đã chia sẻ, tôi đã thử ngay bây giờ. – BlueSky
Giải pháp của bạn thành công, cảm ơn. – BlueSky
Ở đây nó nói nó không thể tìm thấy ChannelBase lớp. Và tôi không thấy làm thế nào tôi có thể sử dụng điều này với các phương pháp không đồng bộ. Cảm ơn bạn! – cheeesus