【问题标题】:How to define attributes to upload data to a REST web service implemented through a WCF service?如何定义属性以将数据上传到通过 WCF 服务实现的 REST Web 服务?
【发布时间】:2011-12-22 11:15:51
【问题描述】:

我创建了一个 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?

谢谢

【问题讨论】:

    标签: wcf rest webinvoke


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多