我使用WCF类库模板创建了一个非常简单的项目,现在我尝试在Visual Studio中运行它。 没有编译错误,但是当WCF测试客户端窗口打开时,我得到一个带有异常的对话框,我无法理解最新情况:
以下是例外的完整描述:
************** 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;
}
}
}
答案 0 :(得分:3)
我通过按照这个问题接受的答案来解决我的问题:Unable to add service in WcfTestClient when copy to a different machine
当我使用Windows 8.1时,我已经安装了适用于Windows 8.1的Windows SDK,现在一切正常。
如果要在计算机上安装它,请注意您正在安装的SDK的版本。每个Windows版本都有正确的版本。
答案 1 :(得分:0)
接口是&#34; WCF测试客户端中的错误&#34;在尝试从注册表中读取信息时。
如果看一下源代码,那么实际上不可能安装SDK。但是这个bug会阻止该工具实际使用访问注册表时运行的代码失败,因为NullReferenceException
不是预期的,但它应该是。{1}}。在不存在的密钥上调用OpenSubKey
将返回null,因此在通过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;
}
那么应该如何向微软报告?