C# Xamarin表单ios在ios中调用web服务时发生异常

C# Xamarin表单ios在ios中调用web服务时发生异常,c#,web-services,xamarin.forms,xamarin.ios,C#,Web Services,Xamarin.forms,Xamarin.ios,我在Xamarin ios中调用web API时遇到了一个异常(android运行良好),我的步骤是 使用svcutil.exe生成配置文件和C#文件 调用客户端时将在表单中出现异常。GetLoginToken(仅在ios中,android没有问题)。例外情况是MonoTouch不支持动态代理代码生成。重写此方法或其调用方以返回特定的客户端代理实例。如何解决此问题?因此,iOS中的WcfCore和Mono存在一些问题。例如,它不能生成动态代理。如果您看到您的代码,就会发现IorderapicCh

我在Xamarin ios中调用web API时遇到了一个异常(android运行良好),我的步骤是

  • 使用svcutil.exe生成配置文件和C#文件

  • 调用客户端时将在表单中出现异常。GetLoginToken(仅在ios中,android没有问题)。例外情况是MonoTouch不支持动态代理代码生成。重写此方法或其调用方以返回特定的客户端代理实例。如何解决此问题?

    因此,iOS中的WcfCore和Mono存在一些问题。例如,它不能生成动态代理。如果您看到您的代码,就会发现IorderapicChannel没有实现。在WCF核心中,这将在运行时创建。但在你的情况下,你应该用手来实现它

    ChannelFactory有一个虚拟方法CreateChannel()。如果不重写,它将使用动态代码生成,这在MonoTouch上会失败

    解决方案是重写它并提供自己的编译时实现。 这里有一个很好的例子: svc util生成的文件聊天


    手动创建的文件:

    当输入元素接口API时,出现错误“未包含“调用”的定义”,这与Xamarin.iOS版本不同?
    <!--config file-->
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <basicHttpBinding>
                    <binding name="BasicHttpBinding_IOrderApi" />
                </basicHttpBinding>
            </bindings>
            <client>
                <endpoint address="http://40.115.139.190:9002/OrderApi.svc" binding="basicHttpBinding"
                    bindingConfiguration="BasicHttpBinding_IOrderApi" contract="IOrderApi"
                    name="BasicHttpBinding_IOrderApi" />
            </client>
        </system.serviceModel>
    </configuration>
    
    /* C# */
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    [System.ServiceModel.ServiceContractAttribute(ConfigurationName="IOrderApi")]
    public interface IOrderApi
    {
    ...    
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOrderApi/GetLoginToken", ReplyAction="http://tempuri.org/IOrderApi/GetLoginTokenResponse")]
        string GetLoginToken(string args);
    
    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IOrderApi/GetLoginToken", ReplyAction="http://tempuri.org/IOrderApi/GetLoginTokenResponse")]
        System.Threading.Tasks.Task<string> GetLoginTokenAsync(string args);
    
    ...
    }
    
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public interface IOrderApiChannel : IOrderApi, System.ServiceModel.IClientChannel
    {
    }
    
    [System.Diagnostics.DebuggerStepThroughAttribute()]
    [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
    public partial class OrderApiClient : System.ServiceModel.ClientBase<IOrderApi>, IOrderApi
    {
    
        public OrderApiClient()
        {
        }
    
        public string GetLoginToken(string args)
        {
            return base.Channel.GetLoginToken(args);
        }
    
        public System.Threading.Tasks.Task<string> GetLoginTokenAsync(string args)
        {
            return base.Channel.GetLoginTokenAsync(args);
        }
    }
    
    /* Xamarin Form */
    private void DoProcess()
    {
        LoginData loginData = new LoginData();
    
        loginData.StaffCorpCode = CompanyEdit.Text;
        loginData.StaffId = MemberEdit.Text;
        loginData.StaffPassword = PasswordEdit.Text;
    
        OrderApiClient client = new OrderApiClient(new BasicHttpBinding(), new EndpointAddress("http://40.115.139.190:9002/OrderApi.svc"));
    
        string loginReturn = client.GetLoginToken(JsonConvert.SerializeObject(loginData));
    }