UriFormatException:无效的URI:指定的端口无效
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UriFormatException:无效的URI:指定的端口无效相关的知识,希望对你有一定的参考价值。
Uri下面用作参数的程序集限定字符串在XAML中工作,但在代码中使用时会显示错误。
我尝试了各种各样的UriKind同样的结果。我怎样才能解决这个问题?
[Test]
public void LargeImageSource_IsKnown()
{
var uri = new Uri(
"pack://application:,,,/" +
"MyAssembly.Core.Presentation.Wpf;component/" +
"Images/Delete.png", UriKind.RelativeOrAbsolute);
Assert.That(
_pickerActivityCollectionVm.DeleteActivityCommand.LargeImageSource,
Is.EqualTo(uri));
}
System.UriFormatException : Invalid URI: Invalid port specified.
at System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
at System.Uri..ctor(String uriString, UriKind uriKind)
UPDATE
根据Thomas的精湛答案和我自己对可读性的评论,我在BaseTestFixture类中使用了以下内容。希望这有助于其他人。
protected virtual void OnFixtureSetUp() {
// logging, other one time setup stuff...
const string scheme = "pack";
if (!UriParser.IsKnownScheme(scheme)) {
Assert.That(PackUriHelper.UriSchemePack, Is.EqualTo(scheme));
}
}
那是因为你在pack://
方案尚未注册时执行此代码。创建Application
对象时会注册此方案。您可以在测试夹具的设置中添加此代码:
[SetUp]
public void Setup()
{
if (!UriParser.IsKnownScheme("pack"))
new System.Windows.Application();
}
编辑:实际上似乎pack://
方案是在PackUriHelper
类的类型初始化器中注册的(恰好由Application
类使用)。所以实际上你不需要创建Application
的实例,你只需要访问PackUriHelper
的静态成员来确保类型初始化程序已经运行:
[SetUp]
public void Setup()
{
string s = System.IO.Packaging.PackUriHelper.UriSchemePack;
}
看来访问PackUriHelper.UriSchemePack
只注册pack
方案,而不是application
方案,我需要在单元测试中使用pack://application:,,,/
语法。因此,我不得不使用new Application()
方法,该方法适用于注册这两种方案。
如果您在Windows应用商店/ WinRT项目中看到此错误:
在尝试在我的C#应用程序中加载资源时,我根本无法使用“pack://”语法。有效的是ms-appx://这种语法:
ms-appx://[project folder]/[resource path]
例如,我想从文件夹“core”加载名为“styles.xaml”的资源字典。这个URI最终为我工作:
dictionary.Source = new System.Uri("ms-appx:///core/styles.xaml");
即使问题指定了WPF,问题似乎非常相似,但最终得到了一个完全不同的解决方案,需要一段时间才能找到,现有的答案根本没有帮助。
同样,此解决方案不适用于WPF
以上是关于UriFormatException:无效的URI:指定的端口无效的主要内容,如果未能解决你的问题,请参考以下文章
UriFormatException:无效的URI:指定的端口无效
Uri.EscapeDataString() - 无效的 URI:Uri 字符串太长