使用移动设备访问托管在Windows服务中的WCF服务

时间:2015-11-09 08:41:09

标签: c# wcf xamarin xamarin.ios xamarin.android

我正在尝试使用Android设备访问托管在Windows服务中的WCF服务。我已经通过xamarin tutorial来使用IIS中托管的WCF服务,并通过tutorial来托管使用Windows服务的WCF并使用控制台应用程序访问它。
到目前为止,我已经尝试过这两种解决方案,但没有任何效果。 我可以解决的是,FileNotFoundException被抓住了,说它错过了ServiceReferences.ClientConfig目录中的/。所以我试图嵌入这个文件(由SLsvcUtil创建),但没有任何效果。
每当我调用OpenAddAsync或其他东西时,我都会得到一个ReferenceNullException 那么,使用移动设备连接到WindowsService托管的WCF服务的正确方法是什么?

1 个答案:

答案 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也可以共享。