0

我创建了一个 WCF 服务,它返回一些数据并允许发布一些数据。服务方式如下:

    [OperationContract]
    bool UploadStream(Guid key, List<StreamRecord> values);

    [OperationContract]
    bool RegisterStream(Guid key);

    [OperationContract]
    StreamCollection GetStreams(Guid key);

我需要使用 REST 接口来实现它。我创建了一个新接口,IRestService 如下

    [WebInvoke(
        Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "/bitpool/{poolKey}/streams")]
    BitStreamCollection GetBitStreams(string poolKey);

它工作正常(我可以从浏览器地址栏测试它,一切都很好)

现在我也想实现 Upload 方法,但我不知道该怎么做我试过了

    [WebInvoke(
        Method = "POST",
        RequestFormat = WebMessageFormat.Xml,
        ResponseFormat = WebMessageFormat.Xml,
        UriTemplate = "/stream/{streamKey}/records/{values}")]
    bool UploadStream(string streamKey, List<StreamRecordEntity> values);

但是当我尝试在浏览器中访问该服务时,它会出错

http://localhost:6767/RestServer.svc/

它给出了一个错误:

合约“IRestServerJson”中的操作“UploadBitStream”有一个名为“values”的路径变量,它没有“字符串”类型。UriTemplate 路径段的变量必须具有“字符串”类型。

我认为对于 POST 我无法定义这样的 URL,但我应该怎么做呢?

此外,方法 RegisterStream 应该检查是否存在带有 key 的流,如果不存在,则创建它并返回 true,否则返回 false。

我应该将其定义为 GET(因为它必须返回结果)还是 PUT 或 POST?

谢谢

4

1 回答 1

1

在请求values的正文中传递,格式为 xml,而不是 url。POST一个简单的测试方法是使用Fiddler

关于RegisterStreamPOSTPUT都可以在响应正文中返回信息。您可以POST根据服务器采取的操作使用并返回适当的 HTTP 状态代码: 201 Created如果资源已创建,则在资源已存在时在您的应用程序中有意义的不同状态代码。

调用者可以根据返回的 HTTP 状态码判断资源是已创建还是已经存在,因此bool不需要返回值。

旁注:您可以使用[WebGet(...)]代替[WebInvoke(Method = "GET"...)]

于 2011-11-05T00:49:35.113 回答