C# 小田;WCF:无法执行POST、PUT&;删除

C# 小田;WCF:无法执行POST、PUT&;删除,c#,wcf,visual-studio,wcf-data-services,odata,C#,Wcf,Visual Studio,Wcf Data Services,Odata,我已经使用教程使用Visual Studio 2012配置并构建了WCF和oData 因此,我使用了Firefox REST客户端插件来测试它是否工作正常 这是我处理json的基本URL,192.168.1.4/TestdataService/TestdataService.svc/User?$format=json 我可以成功地做手术。但是,我无法执行POST、PUT和DELETE操作 POST操作说明 状态代码:415不支持的媒体类型 它的响应体为 { "odata.erro

我已经使用教程使用Visual Studio 2012配置并构建了WCF和oData

因此,我使用了Firefox REST客户端插件来测试它是否工作正常

这是我处理json的基本URL,
192.168.1.4/TestdataService/TestdataService.svc/User?$format=json

我可以成功地做手术。但是,我无法执行POST、PUT和DELETE操作

POST操作说明

状态代码:415不支持的媒体类型

它的响应体

 {
  "odata.error": {
    "code": "",
    "message": {
      "lang": "en-US",
      "value": "Unsupported media type requested."
    }
  }
}
{
  "odata.error": {
    "code": "",
    "message": {
      "lang": "en-US",
      "value": "The URI 'http://192.168.1.4/TestdataService/TestDataService.svc/User?$format=json' is not valid for DELETE operation. The URI must refer to a single resource from an entity set or from a property referring to a set of resources."
    }
  }
}
放置和删除操作

状态代码:405方法

不允许:获取、发布

它的响应体

 {
  "odata.error": {
    "code": "",
    "message": {
      "lang": "en-US",
      "value": "Unsupported media type requested."
    }
  }
}
{
  "odata.error": {
    "code": "",
    "message": {
      "lang": "en-US",
      "value": "The URI 'http://192.168.1.4/TestdataService/TestDataService.svc/User?$format=json' is not valid for DELETE operation. The URI must refer to a single resource from an entity set or from a property referring to a set of resources."
    }
  }
}
我附上下面的截图。在此方面的任何帮助都将不胜感激

谢谢

获取

发布

PUT


我想你这里有两个不相关的问题。
PUT
DELETE
动词必须指特定的实体,而不是实体集。当您将
放入
TestDataService.svc/User
时,这就像试图更新整个实体集,这是不允许的。相反,您需要指定要更新的实体(例如,通过
PUT
-ting到
TestDataService.svc/User(0)
,或者通过键查找实体集的方式)

POST
问题不同。在
POST
情况下,您应该以实体集为目标,而不是以独立实体为目标。您收到的错误与请求的
内容类型
接受
标题有关。现在(为了简化调试),我将在URI中去掉
$format=json
参数,因为这会覆盖
Accept
头。尝试在
POST
请求中包含以下标题值:

Accept: application/json
Content-Type: application/json
DataServiceVersion: 3.0;
MinDataServiceVersion: 3.0;
MaxDataServiceVersion: 3.0;
如果您仍然遇到错误,请告诉我们

同样,这个
POST
请求应该像最初一样转到
TestDataService.svc/User
PUT
DELETE
应指向单个实体(例如,
TestDataService.svc/User(0)


此外,正如qujck在上面的评论中指出的,在您的屏幕截图中,PUT和POST的请求主体是空的。POST的意思是“插入此条目”,因此您需要在请求正文中提供要插入的条目。PUT的意思是“替换/更新此条目”,因此在这种情况下,您还需要向服务器提供数据。

我认为您在这里遇到了两个不相关的问题。
PUT
DELETE
动词必须指特定的实体,而不是实体集。当您将
放入
TestDataService.svc/User
时,这就像试图更新整个实体集,这是不允许的。相反,您需要指定要更新的实体(例如,通过
PUT
-ting到
TestDataService.svc/User(0)
,或者通过键查找实体集的方式)

POST
问题不同。在
POST
情况下,您应该以实体集为目标,而不是以独立实体为目标。您收到的错误与请求的
内容类型
接受
标题有关。现在(为了简化调试),我将在URI中去掉
$format=json
参数,因为这会覆盖
Accept
头。尝试在
POST
请求中包含以下标题值:

Accept: application/json
Content-Type: application/json
DataServiceVersion: 3.0;
MinDataServiceVersion: 3.0;
MaxDataServiceVersion: 3.0;
如果您仍然遇到错误,请告诉我们

同样,这个
POST
请求应该像最初一样转到
TestDataService.svc/User
PUT
DELETE
应指向单个实体(例如,
TestDataService.svc/User(0)


此外,正如qujck在上面的评论中指出的,在您的屏幕截图中,PUT和POST的请求主体是空的。POST的意思是“插入此条目”,因此您需要在请求正文中提供要插入的条目。PUT的意思是“替换/更新此条目”,因此在这种情况下,您也需要向服务器提供数据。

您可以显示PUT/post请求的消息体示例吗?@qujck:我添加了消息体屏幕截图。不幸的是,屏幕截图没有显示在我的浏览器中(我认为我们的代理服务器必须阻止它们)您可能在URI中缺少DELETE and PUT的标识符:
TestDataService.svc/User(1)?$format=json
注意添加了(1),这是资源标识符的一个示例。您的id可能不同,因此请检查您的数据库是否有有效的id。PUT/POST需要消息正文-如果不包含有关该资源的数据,则无法更新该资源。PUT(和DELETE)将需要URI中的标识符(n)。能否显示PUT/post请求的消息正文的示例?@qujck:我添加了消息正文屏幕截图。不幸的是,屏幕截图没有显示在我的浏览器中(我认为我们的代理服务器必须阻止它们)您可能在URI中缺少DELETE and PUT的标识符:
TestDataService.svc/User(1)?$format=json
注意添加了(1),这是资源标识符的一个示例。您的id可能不同,因此请检查您的数据库是否有有效的id。PUT/POST需要消息正文-如果不包含有关该资源的数据,则无法更新该资源。PUT(和DELETE)将需要URI中的标识符(n)。感谢您解释Post和PUT之间的区别,我不知道前者的目标是集合,后者是单个实体。通过PUT进行更新时是否需要指定所有字段?感谢您解释Post和PUT之间的区别,我不知道前者针对的是一个集合,而后者针对的是一个单独的实体是否需要指定所有fi