对象引用未设置为和对象错误的实例?

超级错误

成员
加入
2019年10月10日
消息
5
编程经验
3-5
大家好,
我在代码之后,我将无法设置为对象错误的实例...
C#:
private void AddRewriteRule(string port, string avPort, string ruleName, string ruleUrlMatch)
{
    using (ServerManager serverManager = new ServerManager())
    {
        Site site = serverManager.Sites.FirstOrDefault(s => s.Bindings.ElementAt(0).EndPoint.Port == Int32.Parse(port));
        string siteName = site.Name;

我认为它在突出显示的代码中爆发,可能与Int32.parse有关。当
在该代码之后,我对消息进行了故障排除消息,它从未达到过。当您可以看到,端口将作为字符串中的函数。
有什么想法在这里有什么问题?这是一个小部件的代码,我们还没有看到这个问题所以它正在工作。抓住我的头。
任何帮助或指出我所能看的/谁会非常感激!

谢谢!!!!
 
最后编辑了主持人:

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,714
地点
悉尼,澳大利亚
编程经验
10+
在调试或部署代码时是否发生这种情况?如果前者,调试器将究竟介绍异常抛出的行。如果后者,您应该记录例外,堆栈跟踪将告诉您,如果您部署了PDB文件,也会告诉您在问题上的行为。

A NullReferenceException occurs when you try to access a member of an object via a variable (or other reference, e.g. function result) that is null. The Int32.Parse call can't be the issue because there's no reference there to be null.

There is an obvious issue with your code though. You call firstordfault. and then you just go ahead and use the result. The whole point of firstordfault. is that it might return null. What is most likely happening is that it is indeed returning null, because there are no matching items, and the exception occurs when you try to get the Name of an object that doesn't exist.

第一的ly, you need to make sure that you are calling the correct method. The 第一的, firstordfault., 单身的 and singledefault. methods are all similar but there is never* a situation where more than one is appropriate. If there might be more than one match but you only the first, you call 第一的 or firstordfault., otherwise you call 单身的 or singledefault.. If there might be no matches then you call firstordfault. or singledefault., otherwise you call 第一的 or 单身的. In short:

第一的1个或更多匹配
firstordfault.0,1或更多匹配
单身的1比赛
singledefault.0或1匹配

If you call 第一的 or 单身的 then you know that the result will be an object, because an exception would have been thrown if there was no match. If you call firstordfault. or singledefault. then the result may be null, so you have to allow for that in subsequent code. You would do that by either checking for null explicitly, e.g.

C#:
Site site = serverManager.Sites.FirstOrDefault(s => s.Bindings.ElementAt(0).EndPoint.Port == Int32.Parse(port));
string siteName = null;

if (site != null)
{
    siteName = site.Name;
}

或者使用空传播,例如使用null传播。

C#:
Site site = serverManager.Sites.FirstOrDefault(s => s.Bindings.ElementAt(0).EndPoint.Port == Int32.Parse(port));
string siteName = site?.Name;

In both those examples, siteName would end up being null if there was no match. As you can see, null propagation is far more succinct, so you should use it if it's appropriate.

基本上,它看起来很可能你只有没有那个端口号的网站。真相很容易确定正确的调试。
 

超级错误

成员
加入
2019年10月10日
消息
5
编程经验
3-5
哇!非常感谢那个解释!我今天会透过它,让你知道。

在QA期间,在内部的内部不会发生问题,但仅在客户网站的这种情况下。

有关更多背景,这里是发生的事情。在我们的Web应用程序安装期间,端口将传递给此实用程序。端口当前默认为80或默认网站。 IIS是一个先决条件,所以在大多数情况下,网站应该在那里并绑定到端口80。

此外,在安装期间,如果从POST安装配置的快捷方式启动了相同的实用程序,则将传递的设置写入信息加载的配置文件。

我必须看看你提供的所有选项,以了解我的案例中最好使用哪个代码,但我认为应该至少有一个港口80的一个网站。IIS或IIS中有什么不妥配置文件以某种方式拧紧。我必须解决从文件中拉出的值并检查IIS。当我们昨天检查时,默认网站在此用户的服务器上指向80。
 
Last edited:

超级错误

成员
加入
2019年10月10日
消息
5
编程经验
3-5
好的,再次感谢您的选择的详细说明。

我鞭打了一个小型应用程序,只需在输入端口号后显示此代码以显示站点的名称。使用FirstordFault和Enterning端口80,所有都很好,并显示默认的网站。

然后,我输入端口81并将“对象引用未设置为对象的实例”。错误。所以,我首先转换为使用没有网站的端口,我得到'序列不包含匹配元素。'那个似乎更合适。

但是,我猜您可以使用主机标头在单个端口上有多个网站,因此我不确定哪个是最好的。我必须使用DEV检查我们的应用程序是否需要将其应用程序安装在该站点,以将其安装为绑定到特定端口的唯一网站,在此案例80(现在)。
 

超级错误

成员
加入
2019年10月10日
消息
5
编程经验
3-5
If there being no matches is a reasonable scenario then use firstordfault. and then test for null. Then neither of those exceptions can be thrown.

那是事。我认为将至少有一次打击,并根据客户的机器,我认为代码应该是OK,或者至少正常运作。

我应该如何检查null?在尝试捕获并检查异常或(<查找端口号的网站> !null)?

如果端口上找不到函数的网站,我可以提高一个自定义异常,指示该端口上找不到网站。这可能有助于我们在该领域的部署人员。如果端口上找不到网站,我可以显示信息/自定义异常,然后只是退出。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,714
地点
悉尼,澳大利亚
编程经验
10+
如果没有匹配是一个特殊情况,即不应该在正常操作下发生,然后抛出异常是完全可以接受的,并且可能是最好的选择。
 

超级错误

成员
加入
2019年10月10日
消息
5
编程经验
3-5
优秀,感谢您的所有帮助和信息。快速回复也很欣赏!

另一个快速问题,我不知道这是否定主题,但从上面的代码中,尝试通过端口获取网站,这实际上是如何工作的。它是否尝试在该端口上以某种方式进行通信,或者只是查询网站属性并从配置文件等找到端口?

我问的原因是我在用户系统上扔了一个自定义异常来解决问题,并且似乎代码看起来并不看出端口。我只是试图破译如何是可能的。当我们在系统上查看IIS时,网站上的端口80绑定了绑定。

我应该说,我们昨天注意到他们的系统奇怪。我们注意到Web.config文件从InetPub \ wwwroot消失,因此在这个系统上通常有一个IIS的东西。它可能已经暴露了一个区域,以便在我的部分上处理更好的错误。
 

jmplhinney.

C#论坛主持人
工作人员
加入
2011年4月23日
消息
3,714
地点
悉尼,澳大利亚
编程经验
10+
I don't know exactly what serverManager is but I can tell you that there's no communication going on. The code enumerates the items in the serverManager.Sites collection and, for each one, examines the first item in its Bindings collection. It looks at the EndPoint property of that object and the Port property of that. That is just reading the existing configuration information, not trying to use it to communicate.
 

跳伞运动员

工作人员
加入
2019年4月6日
消息
2,880
地点
切萨皮克,va.
编程经验
10+
我建议改变这个:
C#:
Site site = serverManager.Sites.FirstOrDefault(s => s.Bindings.ElementAt(0).EndPoint.Port == Int32.Parse(port));
string siteName = site.Name;

至:
C#:
if (!int32.TryParse(port, out int32 portNumber))
    throw new FormatException("Port number could not be parsed");

Site site = serverManager.Sites.FirstOrDefault(s => s.Bindings.Any(b => b.EndPoint.Port == portNumber));
if (site == null)
    throw new InvalidOperationException($"No site with binding to port {portNumber} found.");

string siteName = site.Name;
 
最佳 底部