簡體   English   中英

Xamarin 表單 ios 在 iOS 中調用 Web 服務時出現異常

[英]Xamarin form ios get exception when calling web service in iOS

在 Xamarin ios 中調用 Web API 時出現異常(android 工作正常),我的步驟是

  1. 使用 svcutil.exe 生成配置和 C# 文件
<!--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);
    }
}
  1. 以 Xamarin 形式調用 web api GetLoginToken
/* 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));
}

調用客戶端時會在表單中出現異常。 GetLoginToken (僅在 ios 中,android 沒有問題)。 例外是MonoTouch 不支持動態代理代碼生成。 覆蓋此方法或其調用者以返回特定的客戶端代理實例 如何解決這個問題?

因此,iOS 中的 WcfCore 和 Mono 存在一些問題。 例如,它不能生成動態代理。 如果你看到你的代碼,你會發現 IOrderApiChannel 沒有實現。 在 WCF 核心中,這將在運行時創建。 但在你的情況下,你應該手動實現它。

ChannelFactory 有一個虛方法 CreateChannel()。 如果這不被覆蓋,它將使用動態代碼生成,這在 MonoTouch 上失敗。

解決方案是覆蓋它並提供您自己的編譯時實現。 這是一個很好的例子:svc util 生成的文件聊天https://github.com/sami1971/SimplyMobile/blob/master/Core/Plugins/Stocks/SimplyMobile.Plugins.WcfStockService/StockQuoteServiceClient.cs

手動創建的文件: https : //github.com/sami1971/SimplyMobile/blob/master/Core/Plugins/Stocks/SimplyMobile.Plugins.WcfStockService/StockQuoteServiceClient.iOS.cs

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM