我有一个页面,通过jQuery的$.getScript功能动态添加脚本引用.脚本加载并执行正常,所以我知道引用是正确的.但是,当我向任何脚本添加"调试器"语句以允许我在调试器(例如VS.Net,Firebug等)中单步执行代码时,它不起作用.似乎jQuery加载脚本的方式阻止了调试器查找文件.
有没有人为此解决这个问题?
安装程序
我有一个WCF服务,它暴露了一个基类型(例如Animal)以及一些派生类型(例如Lion,Tiger和Bear).另一种类型(例如,Zoo)包括属性,该属性是基类型的集合.基类型是具体的,而不是抽象的,因此集合包含基类型和/或派生类型(以任意组合)的实例是完全可以接受的.例如:
[DataContract, KnownType(typeof(Lion)),
KnownType(typeof(Tiger)), KnownType(typeof(Bear))]
public class Animal
{
[DataMember]
public string Species { get; set; }
}
[DataContract]
public class Lion : Animal { }
[DataContract]
public class Tiger : Animal { }
[DataContract]
public class Bear : Animal { }
[DataContract]
public class Zoo
{
[DataMember]
public List<Animal> Animals { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的一个服务操作接受此类型作为其参数,如下所示:
[ServiceContract]
public interface IZooService
{
[OperationContract]
void SetZoo(Zoo zoo);
}
Run Code Online (Sandbox Code Playgroud)
所有这些都很好,并且发出的WSDL对我来说看起来非常好.它包含所有类型,并正确指示派生类型从基类型继承.所以,我应该能够使用SOAP消息调用我的服务,如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:z="http://zoo.org">
<soapenv:Header/>
<soapenv:Body>
<z:SetZoo>
<z:Zoo>
<z:Animals>
<z:Animal> …Run Code Online (Sandbox Code Playgroud) 代码契约一直给我"可能在空引用上调用一个方法"警告所有我的LINQ语句,我找不到一种方法来使它们静音.例如,以下方法生成两个这样的警告,因为我正在访问"car"对象的"Make"和"Model"属性,而不首先检查null.
public IEnumerable<string> GetCarModelsByMake(string make)
{
return from car in Cars
where car.Make == make
select car.Model;
}
Run Code Online (Sandbox Code Playgroud)
在我的特定情况下,我知道Cars集合永远不会包含任何空条目,所以我想我可以在方法中添加一个Assume来静音静态检查器,如下所示:
public IEnumerable<string> GetCarModelsByMake(string make)
{
Contract.Assume(Cars.All(car => car != null));
return from car in Cars
where car.Make == make
select car.Model;
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,大概是因为期望静态检查器理解它有点太多了.所以,我决定使用以下SuppressMessage属性来禁止警告:
[SuppressMessage("Microsoft.Contracts", "NonNull")]
Run Code Online (Sandbox Code Playgroud)
但由于某种原因,这无法抑制警告.我甚至尝试了以下SuppressMessage属性,其中没有一个工作:
[SuppressMessage("Microsoft.Contracts", "Requires")]
[SuppressMessage("Microsoft.Contracts", "Ensures")]
[SuppressMessage("Microsoft.Contracts", "Invariant")]
Run Code Online (Sandbox Code Playgroud)
我甚至尝试使用ContractVerification属性完全禁用该方法的合同验证:
[ContractVerification(false)]
Run Code Online (Sandbox Code Playgroud)
但这也不起作用.所以,我决定在LINQ语句的"where"子句中添加一个显式的空检查:
public IEnumerable<string> GetCarModelsByMake(string make)
{
return from car in Cars
where car != null && car.Make == make
select car.Model;
}
Run Code Online (Sandbox Code Playgroud)
这成功地消除了"where"子句的警告,但它没有消除"select"子句的警告.事实上,我发现实际上摆脱两个警告的唯一方法是向LINQ语句中的每个子句添加空检查,如下所示:
public IEnumerable<string> GetCarModelsByMake(string make) …Run Code Online (Sandbox Code Playgroud) .net ×1
c# ×1
collections ×1
debugging ×1
inheritance ×1
javascript ×1
jquery ×1
linq ×1
soap ×1
wcf ×1
wsdl ×1