Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用与泛型接口的WCF RESTful服务_C#_Wcf_Generics_Rest - Fatal编程技术网

C# 使用与泛型接口的WCF RESTful服务

C# 使用与泛型接口的WCF RESTful服务,c#,wcf,generics,rest,C#,Wcf,Generics,Rest,我有一个类似的界面: [ServiceContract] public interface IBaseService<T> { [OperationContract] [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] List<T> LoadById(string value);

我有一个类似的界面:

[ServiceContract]
public interface IBaseService<T>
{
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<T> LoadById(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<T> Load(string field, string value);
}
这些方法将在多个服务中实现。实施示例如下所示:

[ServiceContract]
[ServiceKnownType(typeof(ObjectDTO))]
public interface IObjectService : IBaseService<ObjectDTO>
{
}

我的问题是,是否可以在基本服务接口中的OperationContracts上使用UriTemplates使用此体系结构设置RESTful服务?我试着四处搜索,但没有看到其他人试图以这种方式设置REST式服务。

这纯粹是我的想法,但我强烈建议您尝试一下,而不是在WCF中添加基于RPC的框架REST支持。在OpenRasta中,这当然是可能的。

使用web服务继承是我一直发现很难实现的事情,因此我强烈建议不要这样做。相反,考虑将Web服务构建为存根,然后调用与您所做的类似结构的共享逻辑。


如果您想要一种轻松创建无需配置的web服务的方法,您应该查看。它是一个开源web服务框架,允许您创建REST完整的JSON和XML web服务,而无需任何端点配置、服务或操作契约——只使用POCO数据契约。这里展示了创建由Ajax和Silverlight客户端调用的简单REST web服务所需的客户端和服务器代码:

鉴于REST服务的使用方式,我不确定使用泛型是否有任何意义。当您切换到动态传输时,您将失去强输入的所有好处

JSON序列化是动态的,不支持类型,那么为什么需要强类型输出呢

[ServiceContract]
public interface IBaseService
{
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<object> LoadById(string value);

    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)]
    List<object> Load(string field, string value);
}
将产生相同的JSON输出


考虑到这一点,我认为最好的办法就是不要在REST中使用泛型。

WCF不允许在其服务合同中使用开放泛型。它确实提供了KnownType和ServiceKnownType属性,允许您通知它您的多态性。您可以为ServiceKnownType属性提供一个静态帮助器方法,该属性还返回已知类型的集合。我用它来返回与我的泛型配置匹配的类型

@Ruben-Ummm。。。你是什么意思?我很高兴,本着一种固执己见的精神,你以如此明确的措辞陈述了你的答案。i、 例如,翻译为Don't back man-你现在太努力想成为PC机,想推荐一个好的答案,同时我使用泛型并定义ServiceKnownType,因为这些服务需要能够被.NET客户端和Flex客户端使用。对于.NET客户端来说,使用泛型而不是对象更容易,因为我不必进行任何转换。不幸的是,除了使用第三方体系结构来实现我的服务接口外,我将无法使用带有泛型的基本接口。如果您总是使用.Net到.Net,那么使用REST的好处要小得多-使用普通的旧WCF可能会更好。我们实际上不知道谁将使用我们的服务。我们确实知道我们将从.NET转到.NET,并且我们的服务将托管在不同的服务器上。实际上,我能够让它工作。我所做的是将我想通过示例中的基类公开的大部分逻辑转移到WCF NET TCP服务,然后设置一个RESTful端点,并将其作为路由器服务处理到我的NET TCP服务。这实现了我的目标,而无需复制大量代码。在WCF中,泛型+RESTful Web服务似乎存在问题。