【问题标题】:C# - Using Windows.winmd in WCF ServiceC# - 在 WCF 服务中使用 Windows.winmd
【发布时间】:2017-07-03 00:42:08
【问题描述】:

我想在 WCF 服务中使用“BluetoothLEAdvertisementWatcher”

public override void StartWathchingAsync()
        {
            BluetoothLEAdvertisementWatcher BluetoothWatcher = new BluetoothLEAdvertisementWatcher();
        }

但是当我创建“BluetoothLEAdvertisementWatcher”的实例时,我收到以下错误

Error Image

在 mscorlib.dll 中发生“System.ServiceModel.FaultException`1”类型的未处理异常

附加信息:参数不正确。 (例外来自 HRESULT: 0x80070057 (E_INVALIDARG))

一个异常详细信息,可能由 IncludeExceptionDetailInFaults=true,其值为: System.ArgumentException:参数不正确。 (例外来自 HRESULT: 0x80070057 (E_INVALIDARG)) 在 MeasurementDeviceService.MeasuringDeviceClasseis.XiaomiMiScale.StartWathchingAsync() 在 MeasurementDeviceService.DeviceService.GetData(MeasuringDevice 测量设备)在 C:\Users\Programmer\Desktop\Project MahdKodak\MahdKodak\MeasuringDeviceService\DeviceService.svc.cs:line 37 在 测量DeviceService.DeviceService.GetDataXiaomiMiScale(XiaomiMiScale xiaomiMiScale) 在 C:\Users\Programmer\Desktop\Project MahdKodak\MahdKodak\MeasuringDeviceService\DeviceService.svc.cs:line 25 在 SyncInvokeGetDataXiaomiMiScale(对象,对象 [],对象 []) 在 System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(对象 实例,Object[] 输入,Object[]& 输出)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

当我注释下面的代码行时,我的程序运行良好

//BluetoothLEAdvertisementWatcher BluetoothWatcher = new BluetoothLEAdvertisementWatcher();

编辑:

这是我的代码

服务代码:

public class DeviceService : IDeviceService
    {
        Semaphore DeviceSemaphor = null;
        public DeviceService()
        {
            DeviceSemaphor = new Semaphore(1, 1);
        }
        public XiaomiMiScaleData GetDataXiaomiMiScale(XiaomiMiScale xiaomiMiScale)
        {
            return GetData(xiaomiMiScale) as XiaomiMiScaleData;
        }

        public MeasuringDeviceData GetData(MeasuringDevice measuringDevice)
        {
            try
            {
                measuringDevice.StartWathchingAsync();
                return measuringDevice.LastData;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
    }

其他类:

[DataContract]
    public class MeasuringDevice
    {
        [DataMember]
        public MeasuringDeviceData LastData { get; set; }
        public MeasuringDevice()
        {
        }
        [DataMember]
        public ulong DeviceBluetoothAddress { get; set; }
        public virtual void StartWathchingAsync()
        {

        }
    }

[DataContract]
    public class XiaomiMiScale : MeasuringDevice
    {
        public XiaomiMiScale()
        {
            LastData = new XiaomiMiScaleData();
        }

        public override void StartWathchingAsync()
        {
            BluetoothLEAdvertisementWatcher BluetoothWatcher = new BluetoothLEAdvertisementWatcher();
        }
    }

【问题讨论】:

  • 如果您的方法只有一行导致异常的代码,那么当您注释该行时,您的方法当然会运行良好。您是否检查过 BluetoothLEAdvertisementWatcher 构造函数是否需要构造函数参数?您是否有权访问 API 或者可能会发布整个代码?

标签: java c# .net wcf


【解决方案1】:

问题出在测量设备服务.MeasuringDeviceClasseis.XiaomiMiScale.StartWathchingAsync() 或测量设备服务.设备服务.GetData(测量设备测量设备) 中的某处导致引发异常。

之所以在堆栈中看到 WCF,是因为上面的代码是在 WCF 服务内部执行的,当错误发生时,异常会通过 FaultException 发送回客户端。

我不知道你的代码或系统,但我的第一个猜测是你需要弄清楚 DeviceService.GetData() 的作用以及如何让它以独立的方式工作。

编辑:尝试运行 BluetoothLEAdvertisementWatcher BluetoothWatcher = new BluetoothLEAdvertisementWatcher();调用 WCF 领域之外的独立方法。

当您这样做时,它是否按预期工作?你能在你的服务器端下一个断点,看看到底抛出了什么异常并粘贴调用堆栈吗?

【讨论】:

  • 谢谢我在控制台应用程序中进行了测试,它运行良好我为我的问题制作了一个 Gif link
  • 我无权访问源代码,但您可能想尝试以下方法:new BluetoothLEAdvertisementWatcher { ScanningMode = BluetoothLEScanningMode.Active }; watcher.Start();
  • 未解决我发现这个link关于元数据是否相关?
  • 不相关。问题在于 BluetoothLEAdvertisementWatcher 以及它如何在无参数的公共构造函数中引发异常。您显示的内容看起来像一个错误,您应该考虑报告它。确保提供完整的工作重现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-08
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
相关资源
最近更新 更多