【问题标题】:Post Request to WCF service from a REST client从 REST 客户端向 WCF 服务发布请求
【发布时间】:2016-08-04 11:50:03
【问题描述】:

在我当前的项目中,我正在向 WCF 服务发送 POST 请求。但是,我得到了空洞的回应。我曾尝试在 stackoverflow 上使用类似的帖子:POST1 和 [POST2][2],但我无法解决问题。 我的WCF服务代码如下:

namespace RestfulWCFService 
{

  [OperationContract]
    [WebInvoke(Method="GET", ResponseFormat= WebMessageFormat.Xml, UriTemplate="xml/?firstname={firstname}&lastname={lastname}")]
    string SayHelloXml(string firstname, string lastname);

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, UriTemplate = "json/{name}")]
    string SayHelloJson(string name);



    [ServiceContract]
    public interface IRestfulTestService 
    {

        [OperationContract]
        [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped,
            UriTemplate = "/data")]
        string SayHelloJSONPOSTRequest(string jsonRequestString);

    }   
} 

接口的实现如下:

namespace RestfulWCFService
{

       string IRestfulTestService.SayHelloXml(string firstname, string lastname)
    {
        return "Hello  " + firstname + " " +  lastname;
    }

    string IRestfulTestService.SayHelloJson(string name)
    {
        return "Hello  " + name;
    }


    public class RestfulTestService : IRestfulTestService
    {
      string IRestfulTestService.SayHelloJSONPOSTRequest(string jsonRequestString)
        {
            return "Hello  " + jsonRequestString; 
        }

    }
}

现在,来自 REST 客户端,我的请求如下:

 http://localhost/RestfulWCFService/RestfulTestService.svc/data 

Content-Type:application/json 和有效载荷是 {"firstname":"Pankesh"} 。我没有收到 WCF 的回复。

我附上我的客户的截图供您参考。

【问题讨论】:

  • 您似乎收到了 500。无法激活该服务。浏览到localhost/RestfulWCFService/RestfulTestService.svc 看看为什么。
  • @smoksnes :当我发出 GET 请求时,该服务已被激活。我正在更新合同定义及其实施文件供您参考。
  • 好的,那么您在客户端显示的状态消息与您发出的请求无关?
  • 是的,截图是关于POST请求的,不是GET请求。我只是发出 GET 请求以检查服务是否已激活...
  • @smoksnes:我已根据您和 Robin 的建议进行了编辑。现在,我得到了响应,但带有一个空字符串。请求提供建议。

标签: c# json rest wcf


【解决方案1】:

在你使用的界面中:

string SayHelloJSONPOSTRequest(string jsonRequestString);

但是在你使用的接口的实现中:

string IRestfulTestService.SayHelloJSONPOSTRequest(string jsonString)

一个错误可能是 json-String-parameter 的命名不同。

编辑:

首先尝试在上面使用的工具中设置原始标题中的内容长度。

另一个可能的错误是你在 return 语句中使用的变量与你给方法的参数不同。

string IRestfulTestService.SayHelloJSONPOSTRequest(string jsonRequestString)
{
     return "Hello  " + jsonString; 
}

【讨论】:

  • 啊哈,好收获!!!我已经更新了。但仍然是同样的问题。让我在问题中更新这一点以避免混淆。
  • 我也对您的内容长度为“0”感到有些困惑。您是否尝试将“Content-Length”设置为 json 字符串的长度作为标头参数?
  • 我没有明确设置content-length为0,要不要我用其他客户端测试POST请求???
  • 我已经从 REST 客户端重新请求服务器,现在内容长度不是零。现在是 25 岁。
  • 首先尝试在您上面使用的工具的原始标题中设置content-length。如果这不能解决您的问题,请尝试编写一个简短的 PHP 脚本来调用您的服务。在这篇文章中有一个简短的例子:stackoverflow.com/questions/10703060/…
【解决方案2】:

这可能是因为您将BodyStyle 设置为WebMessageBodyStyle.Wrapped

当您使用Wrapped 时,您应该将您的数据发布为:

{"jsonRequestString":{"firstname":"Pankesh"}}

您也可以将其更改为WebMessageBodyStyle.Bare,并将其发送为:

{"firstname":"Pankesh"}

【讨论】:

  • 谢谢!当我通过 {"jsonRequestString":"Pankesh"}。它返回“Hello Pankesh”很好。但是,如果我想传递多个 JSON 数据怎么办。我的意思是 - 我想在不更改接口定义的情况下在正文中传递 {"firstname":"Pankesh"}{"lastname":"Patel"}。有可能通过这个吗?
  • 我看到一个答案被接受了,所以我假设你解决了它?
  • 对于body中的一个参数,解决了。但是,问题/挑战仍未解决——我如何在正文中传递多个 JSON 对象???
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-15
  • 2015-06-15
  • 2021-05-30
相关资源
最近更新 更多