使用移动设备访问托管在 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 创建),但没有任何效果。 每次我打电话给OpenAddAsync 或其他东西时,我都会得到一个 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 服务

从 Windows 应用程序访问托管在 IIS 上的 WCF 服务时出现问题

Wordpress无法在移动电话中打开手机数据

访问/更新共享数据库