多个WCF endpoints 类型的最佳实践是什么?即:JSON,JSONP,SOAP和POX?我正在使用WCF 3.5 .
例如,我有以下JSONP Web服务:
namespace RivWorks.Web.Service.JSONP
{
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceContract(Name = "Negotiate", Namespace = "http://rivworks.com/Services/2009/01/15")]
public class Negotiate //: svcContracts.INegotiateService
{
#region Constructors
public NegotiateService() { }
#endregion
#region Methods
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "method")]
public dto.NegotiateSetup GetSetup(string method, string jsonInput)
{ … }
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "method")]
public List<dto.NegotiateSetup> GetSetupAll(string method, string jsonInput)
{ … }
#endregion
}
}
现在,我需要公开SOAP和POX版本 . 我最初的想法是为每个服务类型 endpoints 创建一个WCF应用程序项目 . 然后将每个发布到主网站下的App目录 .
-
RivWorks.Web.Service.SOAP - > http://rivworks.com/services/soap
-
RivWorks.Web.Service.POX - > http://rivworks.com/services/pox
-
RivWorks.Web.Service.JSON - > http://rivworks.com/services/json
-
RivWorks.Web.Service.JSONP - > http://rivworks.com/services/jsonp
我有一个工作代码所在的内部“总线” . 我只想用不同类型的服务 endpoints 包装该总线代码 . 这样做的最佳做法是什么?
PS:有没有一个工具可以将WCF web.config合并到主站点的web.config中?
TIA
-kb
更新:如何处理可应用于Method签名的不同装饰器 . ie - 比较以下方法(相同)和与之关联的装饰器:
POX endpoints 的装饰器:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml)]
public bool ValidateUser(string UserName, string Password)
{
...
}
vs装饰器用于JSON endpoints :
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public bool ValidateUser(string UserName, string Password)
{
...
}
这是方法签名本身发生变化的另一个例子:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
[JSONPBehavior(callback = "method")]
public dto.NegotiateSetup GetSetup(string method, string jsonInput)
{
// Deserialize the input and get all the data we need...
JObject o = Newtonsoft.Json.Linq.JObject.Parse(jsonInput);
string urlRef = String.Format("{0}", o["ref"]).Drop("\"");
string clientDate = String.Format("{0}", o["dt"]).Drop("\"");
string stringProductID = String.Format("({0})", o["productId"]).Drop("\"").Drop("(").Drop(")");
string SKU = String.Format("{0}", o["sku"]).Drop("\"");
string env = String.Format("{0}", o["env"]).Drop("\"");
string stringCompanyID = String.Format("({0})", o["CompanyId"]).Drop("\"").Drop("(").Drop(")");
string boolPortalFlag = String.Format("({0})", o["PortalFlag"]).Drop("\"").Drop("(").Drop(")");
...
}
vs POX endpoints 类型:
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Xml)]
public dto.NegotiateSetup GetSetup(string urlRef, string clientDate, string stringProductID, string SKU, string env, string stringCompanyID, string boolPortalFlag)
{
...
}
1 回答
你为什么要一个单独的项目? WCF可以在单个项目中的许多 endpoints 上公开许多服务 .
只需将其他 endpoints 添加为.svc文件即可 . 如果您对末尾的“.svc”敏感,请做任何您需要做的路由(尽管记住人类没有看到.svc) .