如何解决哪个服务可以允许我将多个ComplexType参数从服务传递到 Xamarin 表单的客户端?
我知道这是一个古老的话题,但我阅读了所有页面和表格,并且几天来我一直在努力解决我的问题。我正在使用 C#-Xamarin 平台来创建移动应用程序。我需要将多个参数从服务传递给客户端。我尝试过 WCF Resftul 但据我所知 Resftul 只允许传递字符串类型,因为它是基于 URL 的。因此,我无法使用 Restful 传递我的多个(复杂类型)参数。然后我只尝试了 WCF,我在 Android 上成功了,我的 android 端运行良好,但在 iOS 端我收到错误,即“MonoTouch 不支持动态代理代码生成。覆盖此方法或其调用者以返回特定的客户端代理实例。” ,我找到了 2 个解决方案,其中一个是 https://forums.xamarin.com/discussion/15148/how-to-access-wcf-service-in-ios-platform-using-xamarin ,第二个是 Monotouch/WCF: How to consume the wcf service without svcutil 但后来我遇到了关于 CreateChannel() 的错误。有没有办法在 WCF 或 Rest 中解决这个问题?如果没有,是否有任何服务允许我将多个参数从服务传递到客户端,尤其是 xamarin.ios?
我的 complexType 类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
namespace Com.BS.AccrumentAndCollectionDefinition
{
[DataContract]
public class ConcreteCollectionDetailQueryCriteria
{
private long payDeskOid;
[DataMember(IsRequired = true)]
public long PayDeskOid
{
get { return payDeskOid; }
set { payDeskOid = value; }
}
private DateTime collectionDateStart;
[DataMember(IsRequired = true)]
public DateTime CollectionDateStart
{
get { return collectionDateStart; }
set { collectionDateStart = value; }
}
private DateTime collectionDateFinish;
[DataMember(IsRequired = true)]
public DateTime CollectionDateFinish
{
get { return collectionDateFinish; }
set { collectionDateFinish = value; }
}
private string receiptSerial;
[DataMember(IsRequired = true)]
public string ReceiptSerial
{
get { return receiptSerial; }
set { receiptSerial = value; }
}
private long? receiptNoStart;
[DataMember(IsRequired = true)]
public long? ReceiptNoStart
{
get { return receiptNoStart; }
set { receiptNoStart = value; }
}
private long? receiptNoFinish;
[DataMember(IsRequired = true)]
public long? ReceiptNoFinish
{
get { return receiptNoFinish; }
set { receiptNoFinish = value; }
}
private List<string> collectionTypeList;
[DataMember(IsRequired = true)]
public List<string> CollectionTypeList
{
get { return collectionTypeList; }
set { collectionTypeList = value; }
}
}*/
public override string ToString()
{
StringBuilder sb = new StringBuilder();
sb.Append("PayDeskOid:").Append(payDeskOid).Append(Environment.NewLine);
sb.Append("CollectionDateStart:").Append(collectionDateStart).Append(Environment.NewLine);
sb.Append("CollectionDateFinish:").Append(collectionDateFinish).Append(Environment.NewLine);
sb.Append("ReceiptSerial:").Append(receiptSerial).Append(Environment.NewLine);
sb.Append("ReceiptNoStart:").Append(receiptNoStart).Append(Environment.NewLine);
sb.Append("ReceiptNoFinish:").Append(receiptNoFinish).Append(Environment.NewLine);
//sb.Append("CollectionTypeCode:").Append(collectionTypeCode).Append(Environment.NewLine);
return base.ToString();
}
}
}
我的 MobileService.cs
public List<ConcretePayDeskBaseCollection> ListPayDeskBasedCollections(string userName,string password,ConcreteCollectionDetailQueryCriteria collectionDetailQueryCriteria)
{
//ConcreteCollectionDetailQueryCriteria collectionDetailQueryCriteria = new ConcreteCollectionDetailQueryCriteria();
try
{
ReportingOperations reportingOperations = new ReportingOperations();
return reportingOperations.ListPayDeskBasedCollections(collectionDetailQueryCriteria);
}
catch (BSException e)
{
FileLogger.Error(CLASS_NAME,"ListPayDeskBasedCollections",e.Message,e.StackTrace,collectionDetailQueryCriteria);
BSCommunicationException commException = new BSCommunicationException();
commException.Id = e.Id;
commException.ExceptionMessage = e.ExceptionMessage;
throw new FaultException<BSCommunicationException>(commException,new FaultReason(commException.ExceptionMessage));
}
catch (Exception e)
{
FileLogger.Error(CLASS_NAME,collectionDetailQueryCriteria);
BSCommunicationException commException = PrepareCommunicationException(e);
throw new FaultException<BSCommunicationException>(commException,new FaultReason(commException.ExceptionMessage));
}
}
和我的界面(IMobileService):
[ServiceContract]
public interface IMobileService
{
[OperationContract]
[FaultContract(typeof(BSCommunicationException))]
[WebInvoke(Method = "POST",UriTemplate = "/ListPayDeskBasedCollections/{userName}/{password}/{collectionDetailQueryCriteria}",BodyStyle = WebMessageBodyStyle.Wrapped,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]
List<ConcretePayDeskBaseCollection> ListPayDeskBasedCollections(string userName,ConcreteCollectionDetailQueryCriteria collectionDetailQueryCriteria);
}
解决方法
终于找到解决办法了!!我取消了我的 WCF 服务,因为它有一些限制,而且在 iOS 上也不够好。感谢 https://stackoverflow.com/a/20226220/12448483,我回到了 Web ApI。这是我的解决方案。有效!!现在我可以轻松地传递复杂和多类型的参数。顺便将参数从客户端传递到服务,您需要使用 PostAsync,如果您对使用它感到困惑,您可以查看此 https://carldesouza.com/httpclient-getasync-postasync-sendasync-c/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。