WCF和RESTful API:远程服务器在DELETE方法上返回错误请求400

时间:2015-09-29 22:56:20

标签: c# asp.net wcf api

我检查过很多帖子/教程/视频但在一个特定情况下仍然无法使用DELETE方法获取工作代码:当我尝试按ID删除时。

下面的工作示例。我将整个json字符串传递给DELETE方法并且它完美地工作(基于它我敢于建议wcf / client配置文件中没有错误)。
WCF

[OperationContract]
[WebInvoke(Method = "DELETE",
    ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json,
    UriTemplate = "delete"
)]
bool DeleteNews(News news);

客户端:

const string WEBSERVICE_URL = "http://localhost:33873/NewsService.svc/delete";
            string jsonData = "{my json string}";
            try
            {
                var webRequest = WebRequest.Create(WEBSERVICE_URL);
                if (webRequest != null)
                {
                    webRequest.Method = "DELETE";
                    webRequest.Timeout = 20000;
                    webRequest.ContentType = "application/json";
                    using (Stream s = webRequest.GetRequestStream())
                    {
                        using (StreamWriter sw = new StreamWriter(s))
                            sw.Write(jsonData);
                    }

                    using (Stream s = webRequest.GetResponse().GetResponseStream())
                    {    
                    }    
                 }    
             }

现在想展示以下对我不起作用的代码。我想知道我不能通过ID使用DELETE WCF

[OperationContract]
[WebInvoke(Method = "DELETE",
    UriTemplate = "delete/?id={id}"
)]
bool DeleteNews(int id);

将URL放到浏览器中,如http://localhost:33873/NewsService.svc/delete/?id=10,并获取“远程服务器返回错误请求,代码为400”(意味着客户端或我的请求出错)。 我也尝试过如下字符串参数:

[OperationContract]
[WebInvoke(Method = "DELETE",
    UriTemplate = "delete/{id}"
)]
bool DeleteNews(string id);

经过此类转换后,网址看起来像http://localhost:33873/NewsService.svc/delete/10
具有相同错误的结果也不成功。

enter image description here

2 个答案:

答案 0 :(得分:1)

您是否在IISExpress中启用了“删除”动词

http://www.iis.net/learn/extensions/introduction-to-iis-express/iis-express-faq http://stevemichelotti.com/resolve-404-in-iis-express-for-put-and-delete-verbs/

你也可以用Fiddler手动测试PUT,DELET动词

答案 1 :(得分:0)

问题已经解决。 我已经尝试了几乎与我发现有关这个问题的事情。根据错误代码,我100%确定这是一个错误的请求/网址我发送到服务器 一旦我在配置文件中更改了服务器行为以查看服务器端是否有任何异常,我发现了导致问题的原因。

easy_install patsy

我将 <serviceBehaviors> <behavior name="Default"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> 转为includeExceptionDetailInFaults并获得了以下详细信息:

enter image description here

根据描述,由于错误的LINQ查询,我的服务器无法处理请求。我的DELETE方法的实现如下:

true

不允许这样的条件public bool DeleteNews(string id) { using (EF.ServiceDBEntities context = new EF.ServiceDBEntities()) { var n = context.News.FirstOrDefault(x => x.NewsID == int.Parse(id)); if (n != null) { context.News.Remove(n); context.SaveChanges(); return true; } } return false; } 。当我将x => x.NewsID == int.Parse(id)移出查询时问题已消失。一些细节here 即便如此,我也无法理解为什么我的服务器返回了erorr代码400(错误的请求)?这个异常是由服务器产生的,不是吗?我知道有代码500属于内部服务器错误,我的例外是一个很好的样本。任何评论都表示赞赏。