0

我正在尝试遵循有关 WCF 的官方基本教程:https ://docs.microsoft.com/en-us/dotnet/framework/wcf/getting-started-tutorial

有一次,在定义服务契约时,教程要求我们输入以下代码

using System;
using System.ServiceModel;

namespace GettingStartedLib
{
        [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
        public interface ICalculator
        {
            [OperationContract]
            double Add(double n1, double n2);
            [OperationContract]
            double Subtract(double n1, double n2);
            [OperationContract]
            double Multiply(double n1, double n2);
            [OperationContract]
            double Divide(double n1, double n2);
        }
}

我对该ServiceContract属性感到非常困惑,尤其是奇怪的命名空间:http://Microsoft.ServiceModel.Samples

这个命名空间是什么?

我试图搜索 的文档ServiceContractAttribute,但我仍然无法理解这里发生了什么:

默认情况下,Name 和 Namespace 属性是合约类型的名称和http://tempuri.org,分别,ProtectionLevel 是 ProtectionLevel.None。建议服务契约使用这些属性明确设置它们的名称、命名空间和保护级别。这样做可以实现两个目标。首先,它构建了一个不直接连接到托管类型信息的契约,使您能够重构托管代码和命名空间,而不会破坏以 WSDL 表示的契约。其次,明确要求合约本身具有一定级别的保护,使运行时能够验证绑定配置是否支持该级别的安全性,从而防止不良配置暴露敏感信息。有关保护级别的详细信息,请参阅了解保护级别。

这个命名空间是什么?我应该将此属性设置为什么?任何我喜欢的字符串?任何特定格式的字符串?在决定放什么时我应该考虑什么?

两个示例 (http://Microsoft.ServiceModel.Sampleshttp://tempuri.org) 都建议我应该输入一个 HTTP 地址。但是什么HTTP地址?我是否应该在这个地址下运行一个服务器来做一些有意义的事情?这个服务器应该做什么?因为,基于这些示例和http://tempuri.org允许的事实(即使不推荐),我知道这个命名空间不应该设置为我的 WCF 服务的地址?(否则,我知道,http://tempuri.org甚至无法在本地托管的 WCF 服务示例上工作,因为该服务不是托管在 tempuri.org 上,而是托管在 localhost 上!`

什么是http://Microsoft.ServiceModel.Samples???它甚至是一个有效的 HTTP 地址吗?如果有,采用什么格式?(当我看到http://something我希望这是一个 IP 地址或域,可以在 DNS 的帮助下解析为 IP 地址,但Microsoft.ServiceModel.Samples似乎两者都不是)我什至尝试http://Microsoft.ServiceModel.Samples在我的浏览器中输入,但不足为奇,我刚刚收到错误服务器未找到。

这个命名空间的含义是什么?什么放在那里?

4

2 回答 2

0

该属性实际上是为生成的 XML 设计的。由于 SOAP 是基于 XML 的,并且 XML 非常喜欢命名空间,因此 SOAP 使用它们。通常,您实际上并不需要担心名称空间,因为将使用一个虚拟名称空间。属性上的此属性的目的是允许您指定一个实际的 XML 名称空间而不是默认名称空间。请注意,此特定属性仅影响 SOAP 定义本身。服务和数据仍将使用默认命名空间(如果您不想要,您也必须将它们归类)。

XML 命名空间的目的是在处理大型 XML 集时分离元素/属性。对于 WCF 服务,这不会成为问题,但有些人还是喜欢指定公司特定的命名空间。这实际上只在面向公众的服务中很常见。对于关心的私人。

因此,除非您正在构建公共服务并且您希望命名空间清楚地引用您的公司,否则您不需要命名空间信息。虽然它通常以 URL 的形式给出,但它不是一个。它只是唯一标识 XML 中的元素/属性。(引自WCF ServiceContract 命名空间的答案)

于 2020-11-27T03:25:52.510 回答
0

@Theobald Du 说“这仅在面向公众的服务中很常见”。好答案。下面的另一个链接可能有助于理解命名空间在面向公众的服务合同中的用途 - 例如远程访问您的服务的在线公共客户端。

  <https://stackoverflow.com/questions/3519014/wcf-versioning-update-attribute-namespaces-and-support-previous-namespaces?rq=1>

此链接表示,当公共客户端需要知道哪个版本的“接口”是新版本时(在服务更新或升级后),服务合同属性的命名空间是必要的。

对于想要使用新更新界面的公共客户端,他们将更改其客户端代理以使用新版本的服务 - 由新的“命名空间”标识。如果他们不想或不需要使用新版本的服务,他们不需要更改他们当前使用的客户端中的任何内容。

至少我认为这是 Service Contract 属性的命名空间值的用途。我没有在我的 [ServiceContract] 属性中使用命名空间,因为我的用户界面、客户端代理和服务应用程序不是“面向公众的”,但它们都是 Winforms 桌面应用程序解决方案的一部分——它使用实体框架访问远程数据库和 WCF 服务 (http SOAP)。

于 2020-12-09T04:19:33.437 回答