是什么导致 Web 服务 URL 和命名空间之间存在差异?

2024-04-10

我有一个包含 Web 服务的 ASP.NET Web 项目。当我运行该服务时,它会将我带到一个显示所有公开方法的页面,使用类似于以下内容的 URLhttp://api.example.com/game/service.asmx.

在 Web 服务的代码中,有些方法具有以下属性:

    [WebService(Namespace = "http://webservices.example.com/GameServices/Game1")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class Game1 : System.Web.Services.WebService
    {
        // code 
    }

我有点困惑为什么具有 webService 属性的类的命名空间与 Web 服务的路径不同。该命名空间从哪里来?是刚刚编出来的吗?


是的,它是编造的。

这听起来很愚蠢,但这是事实。代码中指定的命名空间将用于作为特定 Web 服务的请求和响应进行交换的 XML 文档。如果您在线路上放置一个网络跟踪程序,您会看到消息中来回使用的那些命名空间字符串。在网络服务中,您的应用程序通常不需要关心名称空间。 Web 服务库通常会为您处理这些事情。

尽管人们经常使用 HTTP URL,但名称空间不需要是 HTTP URL。这可能是您大部分困惑的根源。IETF 对 XML 名称空间的建议 http://www.w3.org/TR/REC-xml-names/建议应该是a URI http://www.rfc-editor.org/rfc/rfc3986.txt,但该 URI 不必是 HTTP URI,而且事实上它不需要附加任何“网络协议”。

命名空间是...一个字符串。它用作限定 XML 模式中的信息的简单方法。把它想象成一个人的姓氏。您可能认识几个叫“克里斯”的人。您可以通过姓氏来区分他们。

类似地,元素名称“id”可以在许多不同的 XML 文档和模式中使用。应用程序(以及人们)可以通过其 xml 命名空间区分使用 qname“id”的许多不同元素。

通常,“信息架构师”会将文档或 Web 服务的 XML 命名空间指定为 URI,该 URI 是分层的、对于所属组织来说是唯一的,并且与 XML 文档中信息的含义相关。 (在小型组织中,“信息架构师”只是一名开发人员。)例如http://mycompany.com/services/2013/customer http://mycompany.com/services/2013/customer可能是 MyCompany 的命名空间,创建于 2013 年,与服务相关,特别是客户服务。

在我看来,没有真正的理由使用http://作为 XML 命名空间的 URI 中的方案,除非您计划在该 HTTP URI 上提供文档。您也可以使用 urn:mycompany.com/services/2013/customer 作为 XML 命名空间。事实上它可能更好,因为它表明它只是一个名称,而不是一个定位器。 (不是网址)。

我通常使用 URN,前缀为urn:作为方案,表明名称空间只是一个名称,一个唯一标识符。


EDIT结构是有规则的URNs http://en.wikipedia.org/wiki/Uniform_Resource_Name。基本格式是:

瓮::

...其中 NID 是名称空间 ID,其中之一一组特殊的、经过批准的字符串 http://www.iana.org/assignments/urn-namespaces/urn-namespaces.xml#urn-namespaces-2NSS 是特定于命名空间的字符串。批准的 NID 列表包括 isbn、uuid、ietf 和其他大约 20 个 - 每一个都具有由不同的 IETF RFC 定义的特定含义。

尽管有有关 NID 的规则,但许多人根本懒得遵守,而是使用自己的域名来代替 NID 来创建自己的 URN。例如“mycompany.com”。 (这就是我经常做的事情)。

然后您可以选择如何进一步限定该名称。您可以指定“services”来指示 Web 服务。有些人使用命名空间中启动服务的年份和月份。这允许您更新服务,并使用不同的日期来区分不同的元素。遵循此命名约定的示例 XML 命名空间可能是:

 urn:mycompany.com:services:2011:04:Game

这是什么RFC 2141 http://www.faqs.org/rfcs/rfc2141.html调用“无效 URN”,因为我没有使用注册的 NID。但这符合我的目的。通过应用以下方法将其转换为“有效 URN”是一个简单的步骤fdcNID,定义为RFC 4198 https://www.rfc-editor.org/rfc/rfc4198.

 urn:fdc:mycompany.com:services:2011:04:Game

看看那好多少?

最后,大多数人只是建立自己的命名约定,这是对他们的用途、对 XML 数据的内部和合作伙伴消费者有意义的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是什么导致 Web 服务 URL 和命名空间之间存在差异? 的相关文章

  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • QCombobox 向下箭头图像

    如何更改Qcombobox向下箭头图像 现在我正在使用这个 QSS 代码 但这不起作用 我无法删除向下箭头边框 QComboBox border 0px QComboBox down arrow border 0px background
  • 如何在 C# / .NET 中创建内存泄漏[重复]

    这个问题在这里已经有答案了 可能的重复 托管代码中是否可能存在内存泄漏 特别是 C 3 0 https stackoverflow com questions 6436620 is it possible to have a memory
  • EF Core 通过完全替换断开集合导航属性的更新

    使用 EF Core 5 0 我有一个 SPA 页面 可以加载Group实体及其集合Employee来自 API 的实体 var groupToUpdate await context Groups Include g gt g Emplo
  • ASP.NET Web API 客户端 ProgressMessageHandler Post 任务卡在 WinForm 应用程序中

    我在用着HttpClient and ProgressMessageHandler来自MS ASP NET Web API 客户端库 http nuget org packages Microsoft AspNet WebApi Clien
  • 与 Qt 项目的静态链接

    我有一个在 Visual Studio 2010 Professional 中构建的 Qt 项目 但是 当我运行它 在调试或发布模式下 时 它会要求一些 Qt dll 如果我提供 dll 并将它们放入 System32 中 它就可以工作 但
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • vs2008 c#:Facebook.rest.api如何使用它来获取好友列表?

    如何在此基础上取得进一步的进步 获取好友列表的下一步是什么 string APIKey ConfigurationManager AppSettings API Key string APISecret ConfigurationManag
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • 在 JSQMessagesViewController 中显示 LocationMediaItem

    我刚刚尝试实施LocationMediaItem in my Xamarin iOS应用程序使用JSQMessagesViewController 一切都很顺利 唯一的问题是UICollectionView应该显示位置的单元格永远停留在加载
  • 从 WebBrowser 控件 C# 获取滚动值

    我试图在 WebBrowser 控件中获取网页的 Y 滚动索引 但无法访问内置滚动条的值 有任何想法吗 对于标准模式下的 IE 使用文档类型 正如你所说 scrollTop是的财产元素 而不是 HtmlDocument htmlDoc th
  • 为什么 set_symmetry_difference 无法与比较器一起使用?

    Example program include
  • 是否有相当于 Clang/LLVM 的 .spec 文件,在哪里可以找到参考?

    The gcc驱动程序可以配置为使用特定的链接器 特定的选项和其他细节 例如覆盖系统头 specs files 当前 截至撰写本文时 GCC 版本 4 9 0 的手册此处描述了规范文件 https gcc gnu org onlinedoc
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 使用taskkill停止Windows服务

    我需要帮助来使用 C 终止 Windows 服务 现在要终止该服务 请使用以下选项 从命令 sc queryex ServiceName 发现后PID服务的 taskkill pid 1234 exemple f 为了便于阅读 但如果您明白
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁

随机推荐