我正在关注这个tutorial ,并且还遇到了这个article在我完成上一个教程之后。
让我好奇的是 [ServiceContractAttribute]
。我看到文章中的[ServiceContract]
没有命名空间,但教程中有一个。
所以我继续将 [ServiceContract(Namespace="SandwichServices")]
更改为 [ServiceContract]
,但是当我运行应用程序并单击按钮时,我得到一个异常:Uncaught ReferenceError: SandwichServices is not Defined
。
所以我想知道,
- 除了恢复更改之外,还有其他方法可以解决此错误吗?也许 Web.config 就是答案,但我不确定我是否走在正确的道路上。
- 两个
[ServiceContractAttribute]
有什么区别?从我的角度来看,接口(interface)似乎不需要Namespace
,但我是对的吗?
Web.config 文件内容:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="SandwichServices.CostServiceAspNetAjaxBehavior">
<enableWebScript />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment
aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="SandwichServices.CostService">
<endpoint address=""
behaviorConfiguration="SandwichServices.CostServiceAspNetAjaxBehavior"
binding="webHttpBinding"
contract="SandwichServices.CostService" />
</service>
</services>
</system.serviceModel>
最佳答案
您是对的,您的合约定义中不需要 ServiceContractAttribute 的命名空间属性,但它默认为“http://tempuri.org ”。这用于定义 WSDL 中端口类型的命名空间。从您的问题中不清楚为什么会发生错误。
使用 urn 格式的非默认命名空间(例如 urn:companyname:servicename)是一种很好的做法(特别是对于面向外部的 API)。此外,您可以使用名称属性来进一步定义服务。
示例:
对于菜单服务
[ServiceContract(Name="menu", Namespace="urn:subway:sandwich")]
对于订单服务
[ServiceContract(Name="order", Namespace="urn:subway:sandwich")]
等等
通常,您会将 WSDL 命名空间与代码中的 CLR 命名空间相匹配。
继续这个例子:
namespace Subway.Sandwich
{
[ServiceContract(Name="menu", Namespace="urn:subway:sandwich")]
public interface MenuService
{
}
[ServiceContract(Name="order", Namespace="urn:subway:sandwich")]
public interface OrderService
{
}
}
回答您的具体问题。
- 没有足够的相关信息可供了解(但可能存在配置问题)。
- ServiceContract 和 ServiceContractAttribute 相同,并且不需要命名空间。
关于c# - 放置WCF命名空间与不放置WCF命名空间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23136229/