哪个服务可以允许我将多个(复杂类型)参数从服务传递给 Xamarin Forms 的客户端?

Which Service can allow me to pass Multiple(ComplexType) Parameters from Service to Client For Xamarin Forms?

我知道这是个老话题,但我阅读了所有页面和表格,几天来我一直在努力解决我的问题。我正在使用 C#-Xamarin 平台创建移动应用程序。我需要将多个参数从服务传递给客户端。我尝试了 WCF Resftul,但据我所知,Resftul 只允许传递字符串类型,因为它基于 URL。因此我无法使用 Restful 传递我的多个(复杂类型)参数。然后我只尝试了 WCF,我在 Android 方面成功了,我的 android 方面工作得很好,但在 iOS 方面我得到了错误,即“MonoTouch 不支持动态代理代码生成。覆盖这个return 特定客户端代理实例的方法或其调用者。” ,我找到了 2 个解决方案,其中之一是 https://forums.xamarin.com/discussion/15148/how-to-access-wcf-service-in-ios-platform-using-xamarin ,and the second one is Monotouch/WCF: How to consume the wcf service without svcutil 但后来我得到了关于 CreateChannel() 的错误。有什么方法可以在 WCF 或 Rest 中解决该问题?如果没有,是否有任何服务允许我将多个参数从服务传递给客户端,尤其是 xamarin.ios?

我的复杂类型 class :

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, "ListPayDeskBasedCollections", e.Message, e.StackTrace, 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, string password, ConcreteCollectionDetailQueryCriteria collectionDetailQueryCriteria);
}

终于找到解决办法了!!我取消了我的 WCF 服务,因为它有一些限制并且与 iOS 一起工作得不够好。感谢 .Here the solution for me. It worked!! And now I pass complex and multi type parameters easily. By the way Passing parameters from client to service you need to use PostAsync, if you are confused to use it the you can check this https://carldesouza.com/httpclient-getasync-postasync-sendasync-c/

,我回到了 Web ApI