我正在尝试使用Android设备访问托管在Windows服务中的WCF服务。我已经通过xamarin tutorial来使用IIS中托管的WCF服务,并通过tutorial来托管使用Windows服务的WCF并使用控制台应用程序访问它。
到目前为止,我已经尝试过这两种解决方案,但没有任何效果。
我可以解决的是,FileNotFoundException
被抓住了,说它错过了ServiceReferences.ClientConfig
目录中的/
。所以我试图嵌入这个文件(由SLsvcUtil创建),但没有任何效果。
每当我调用Open
或AddAsync
或其他东西时,我都会得到一个ReferenceNullException
那么,使用移动设备连接到WindowsService托管的WCF服务的正确方法是什么?
答案 0 :(得分:0)
好的,我让它正常工作:
我再次通过CodeProject上的教程。之后,我创建了一个额外的android项目并添加了poxy类。由于我无法使用App.Config文件,因此我在代码中定义了绑定。异步方法由于某种原因会失败,但将它们打包到Task.Run并等待它也能正常工作:
void InitializeServiceConnection()
{
EndpointAddress ea = new EndpointAddress("http://x.x.x.x:9001/CalcService");
BasicHttpBinding bhttpb = new BasicHttpBinding()
{
Security = new BasicHttpSecurity()
{
Mode = BasicHttpSecurityMode.None,
Transport = new HttpTransportSecurity()
{
ProxyCredentialType = HttpProxyCredentialType.None,
ClientCredentialType = HttpClientCredentialType.None
}
},
BypassProxyOnLocal = true
};
objCalcClient2 = new CalcServiceClient(bhttpb, ea);
}
async void DoStuff()
{
dblResult = await Task.Run<double>(delegate { return objCalcClient2.Add(dblX, dblY); });
WriteLine(string.Format("Calling Add >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Subtract(dblX, dblY); });
WriteLine(string.Format("Calling Sub >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Multiply(dblX, dblY); });
WriteLine(string.Format("Calling Mul >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Divide(dblX, dblY); });
WriteLine(string.Format("Calling Div >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
}
void WriteLine(string Text)
{
tvConsole.Text += System.Environment.NewLine + Text;
tvConsole.Invalidate();
}
我不确定是否必须填充Transport属性以获得不安全且未经身份验证的连接,但它有效。多数民众赞成我想要的。
但最好的是,这也适用于作为PCL-Library一部分的Xamarin.Forms项目。
private void Initialize()
{
EndpointAddress ea = new EndpointAddress("http://x.x.x.x:9001/CalcService");
BasicHttpBinding bhttpb = new BasicHttpBinding();
bhttpb.Security.Mode = BasicHttpSecurityMode.None;
objCalcClient2 = new CalcServiceClient(bhttpb, ea);
}
public async void DoStuff()
{
dblResult = await Task.Run<double>(delegate { return objCalcClient2.Add(dblX, dblY); });
WriteLine(string.Format("Calling Add >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Subtract(dblX, dblY); });
WriteLine(string.Format("Calling Sub >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Multiply(dblX, dblY); });
WriteLine(string.Format("Calling Mul >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
dblResult = await Task.Run<double>(() => { return objCalcClient2.Divide(dblX, dblY); });
WriteLine(string.Format("Calling Div >> X : {0:F2} Y : {1:F2} Result : {2:F2}", dblX, dblY, dblResult));
}
void WriteLine(string Text)
{
Debug.WriteLine(Text);
}
我认为我必须为每个设备实现此功能,但不,WCF也可以共享。