官方 WCF 教程中 [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples" )] 的含义是什么?



我正在尝试遵循WCF的官方基本教程:https://learn.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.One。建议服务协定使用这些属性显式设置其名称、命名空间和保护级别。这样做可以实现两个目标。首先,它构建了一个不直接连接到托管类型信息的契约,使您能够重构托管代码和命名空间,而不会破坏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,但不出所料,我只是得到了错误"找不到服务器"。

这个名称空间的含义是什么?放什么?

该属性实际上是为生成的XML设计的。由于SOAP是基于XML的,XML确实喜欢名称空间,所以SOAP会使用它们。通常,您不必担心名称空间,因为会使用一个伪名称空间。属性上此属性的目的是允许您指定实际的XML命名空间,而不是默认的命名空间。请注意,这个特定属性只影响SOAP定义本身。服务和数据仍将使用默认的名称空间(如果您不想这样做,您也必须对它们进行属性设置)。

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

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

@Theobald Du说"这只在面向公众的服务中很常见";。回答不错。下面的另一个链接可能有助于理解在面向公众的服务合同中使用命名空间的目的,比如远程访问服务的在线公共客户端。

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

该链接表示,当公共客户端需要知道"服务契约"属性的哪个版本时,服务契约属性的命名空间是必要的;接口";是服务更新或升级后的新版本。

对于想要使用新更新的接口的公共客户端,他们将改变他们的客户端代理以使用由新的"标识的服务的新版本;名称空间";。如果他们不想或需要使用新版本的服务,则无需更改当前使用的客户端中的任何内容。

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

相关内容

最新更新