使用移动设备访问托管在 Windows 服务中的 WCF 服务
Posted
技术标签:
【中文标题】使用移动设备访问托管在 Windows 服务中的 WCF 服务【英文标题】:Access a WCF service, hosted in a Windows Service with mobile device 【发布时间】:2015-11-09 08:41:09 【问题描述】:我正在尝试使用 android 设备访问托管在 Windows 服务中的 WCF 服务。我已经通过 xamarin tutorial 使用托管在 IIS 中的 WCF 服务,并通过 tutorial 使用 Windows 服务托管 WCF 并使用控制台应用程序访问它。
到目前为止,我已经尝试过这两种解决方案,但没有任何效果。
我所能得到的就是,FileNotFoundException
被捕获,说它错过了/
目录中的ServiceReferences.ClientConfig
。因此,我尝试嵌入此文件(由 SLsvcUtil 创建),但没有任何效果。
每次我打电话给Open
或AddAsync
或其他东西时,我都会得到一个 ReferenceNullException。
那么,使用移动设备连接到 WindowsService 托管的 WCF 服务的正确方法是什么?
【问题讨论】:
如果您使用localHost
托管并使用安卓模拟器,您将无法联系到它。您必须真实地托管您的服务。只是说
如果我说移动设备,我指的是物理移动设备。服务由我的 PC 的本地 IP 托管。此服务不打算托管在 Internet 上,而是托管在 lokal 网络内。是的,该设备位于同一网络中。
我不确定即使是物理设备也可以联系 LocalHost。您必须将其正确托管在本地网络上,而不是 localhost
【参考方案1】:
好的,我让它正常工作了:
我再次完成了 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 库的一部分的 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 也可以共享。
【讨论】:
以上是关于使用移动设备访问托管在 Windows 服务中的 WCF 服务的主要内容,如果未能解决你的问题,请参考以下文章
Azure 功能无法访问托管在内部 windows 服务器中的 WCF 服务
如何从服务“内部”的代码访问托管在 IIS 中的 WCF 服务的 web.config
Windows Mobile Emulator 连接超时访问本地 Web 服务