CSharp - 在 Visual Studio 中使用WCF测试客户端,当运行WCF服务时 NullReferenceException

  显示原文与译文双语对照的内容

我已经使用WCF类库模板创建了一个非常简单的项目,现在我正尝试在 Visual Studio 中运行它。 没有编译错误,但是当WCF测试客户端窗口打开时,我将得到一个带有异常的对话框,我无法理解发生了什么:

dialog

下面是该异常的完整说明:


************** Exception Text **************
System.NullReferenceException: Object reference not set to an instance of an object.
 at Microsoft.Tools.Common.SdkPathUtility.GetRegistryValue(String registryPath, String registryValueName)
 at Microsoft.Tools.Common.SdkPathUtility.GetSdkPath(Version targetFrameworkVersion)
 at Microsoft.Tools.TestClient.ToolingEnvironment.get_MetadataTool()
 at Microsoft.Tools.TestClient.ServiceAnalyzer.GenerateProxyAndConfig(String projectPath, String address, String configPath, String proxyPath, Int32 startProgressPosition, Int32 endProgressPostition, BackgroundWorker addServiceWorker, String& errorMessage)
 at Microsoft.Tools.TestClient.ServiceAnalyzer.AnalyzeService(String address, BackgroundWorker addServiceWorker, Single startProgress, Single progressRange, String& errorMessage)
 at Microsoft.Tools.TestClient.Workspace.AddServiceProject(String endpoint, BackgroundWorker addServiceWorker, Single startProgress, Single progressRange, String& error)
 at Microsoft.Tools.TestClient.AddServiceExecutor.Execute(AddServiceInputs inputs, Workspace workspace, BackgroundWorker addServiceWorker)
 at Microsoft.Tools.TestClient.UI.MainForm.addServiceWorker_DoWork(Object sender, DoWorkEventArgs e)
 at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
 at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)


************** Loaded Assemblies **************
mscorlib
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34209 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
WcfTestClient
 Assembly Version: 12.0.0.0
 Win32 Version: 12.0.21005.1 built by: REL
 CodeBase: file:///C:/Program%20Files%20(x86)/Microsoft%20Visual%20Studio%2012.0/Common7/IDE/WcfTestClient.exe
----------------------------------------
System
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34239 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34209 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34209 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Configuration
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34209 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34230 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.ServiceModel
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34230 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.ServiceModel/v4.0_4.0.0.0__b77a5c561934e089/System.ServiceModel.dll
----------------------------------------
System.Core
 Assembly Version: 4.0.0.0
 Win32 Version: 4.0.30319.34209 built by: FX452RTMGDR
 CodeBase: file:///C:/Windows/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------

我的项目中只有两个文件,IProductService:


namespace LayerNorthwindService
{
//NOTE: You can use the"Rename" command on the"Refactor" menu to change the interface name"IService1" in both code and config file together.
 [ServiceContract]
 public interface IProductService
 {
 [OperationContract]
 Product GetProduct(int id);

 [OperationContract]
 bool UpdateProduct(Product product, ref string message);

//TODO: Add your service operations here
 }

//Use a data contract as illustrated in the sample below to add composite types to service operations.
//You can add XSD files into the project. After building the project, you can directly use the data types defined there, with the namespace"LayerNorthwindService.ContractType".
 [DataContract]
 public class Product
 {
 [DataMember]
 public int ProductID { get; set; }
 [DataMember]
 public string ProductName { get; set; }
 [DataMember]
 public string QuantityPerUnit { get; set; }
 [DataMember]
 public decimal UnitPrice { get; set; }
 [DataMember]
 public bool Discontinued { get; set; }
 }
}

和 ProductService:


namespace LayerNorthwindService
{
//NOTE: You can use the"Rename" command on the"Refactor" menu to change the class name"Service1" in both code and config file together.
 public class ProductService : IProductService
 {
 public Product GetProduct(int id)
 {
 var product = new Product();
 product.ProductID = id;
 product.ProductName ="Product name";
 product.UnitPrice = 10.0m;
 product.QuantityPerUnit ="fake QPU";
 return product;
 }

 public bool UpdateProduct(Product product, ref string message)
 {
 var result = true;

 if (product.UnitPrice <= 0)
 {
 message ="Prince cannot be <= 0";
 result = false;
 }
 else if (string.IsNullOrEmpty(product.ProductName))
 {
 message ="product name cannot be empty";
 result = false;
 }
 else if (string.IsNullOrEmpty(product.QuantityPerUnit))
 {
 message ="QPU cannot be empty";
 result = false;
 }
 else
 {
 message ="product updated successfully";
 result = true;
 }

 return result;
 }
 }
}

时间: 原作者:

我通过执行这里接受的问题答案来解决我的问题: 无法在复制到其他计算机的情况下在WcfTestClient中添加服务。

我使用 Windows 8.1时,已经安装了 Windows 8.1的Windows SDK,现在一切都正常了。

如果要将它安装到你的机器上,请注意你正在安装的SDK版本。 每个 Windows 版本都有正确的版本。

原作者:

在试图读取注册表中的信息时,在"wcf测试客户端"中有接缝为 Bug 。

如果看看源代码,那么没有安装SDK实际上是可以能的。 但这个 Bug 防止工具实际上使用在访问注册表失败时运行的代码,因为 NullReferenceException 不应该。 在不存在的键上调用 OpenSubKey 会返回空,因此在通过 GetValue 访问时它失败。


//Microsoft.Tools.Common.SdkPathUtility
private static string GetRegistryValue(string registryPath, string registryValueName)
{
 string result;
 try
 {
 using (RegistryKey registryKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32))
 {
 using (RegistryKey registryKey2 = registryKey.OpenSubKey(registryPath, false))
 {
 string text = registryKey2.GetValue(registryValueName, string.Empty) as string;
 result = text;
 }
 }
 }
 catch (UnauthorizedAccessException)
 {
 result = string.Empty;
 }
 catch (SecurityException)
 {
 result = string.Empty;
 }
 return result;
}

那么你怎么会把这个报告给微软?

...