Xamarin 表单 ios 在 iOS 中调用 Web 服务时出现异常
Xamarin form ios get exception when calling web service in iOS
我在 Xamarin 中调用 web API 时出现异常 ios(android 工作正常),我的步骤是
- 使用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);
}
}
- 调用网络 api Xamarin 形式的 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 不支持动态代理代码生成。将此方法或其调用者覆盖到 return 特定的客户端代理实例 。如何解决这个问题?
因此,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
生成的文件聊天
我在 Xamarin 中调用 web API 时出现异常 ios(android 工作正常),我的步骤是
- 使用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);
}
}
- 调用网络 api Xamarin 形式的 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 不支持动态代理代码生成。将此方法或其调用者覆盖到 return 特定的客户端代理实例 。如何解决这个问题?
因此,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
生成的文件聊天