CURL 到 WCF 的更好方法

Better way to CURL to WCF

我可以通过 CURL 请求 post 到我用 C# 从 PHP 编写的 web-service,但我无法让请求正确通过。无论我做什么,让 post 显示的唯一方法是 json_encode 表单数据 headers。所以我的 PHP 代码最终是这样的:

$user = array('id'=>5, 'first_name' => 'First', 'last_name' => 'Last');

$uch = curl_init();
curl_setopt($uch, CURLOPT_URL,"http://localhost:50115/Service1.svc/postUser");
curl_setopt($uch, CURLOPT_POST, 1);
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));
curl_setopt($uch, CURLOPT_HTTPHEADER, array(
                                            'Content-Type: application/json'
                                            ));
curl_setopt($uch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($uch);

当我设置线时:

curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode("user=" . json_encode($user)));

至:

curl_setopt($uch, CURLOPT_POSTFIELDS, array("user" => json_encode($user)));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS, 
                    http_build_query(array("user" => json_encode($user))));
--OR--
curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode($user));

PHP 中没有错误,C# 服务没有 return 错误(我确实在配置中设置了 return 异常设置),并且break-point 函数永远不会被命中。

在 C# 方面,我的界面和服务设置如下:

//Interface
[OperationContract]
[WebInvoke(Method="POST",
            BodyStyle=WebMessageBodyStyle.Bare, //Any other value, the break-point 
                                                //will not trigger
            RequestFormat=WebMessageFormat.Json,
            UriTemplate = "postUser")]
void PostUser(string user);

//Service
public void PostUser(string user)
{
    var request = user;
    int i = 5; //Debug set here
}

当 break-point 命中时,我可以看到 user 的值为:

user={"id":5,"first_name":"First","last_name":"Last"}

我想要的是 user 的值只是:

{"id":5,"first_name":"First","last_name":"Last"}

是否可以收到我这样的回复?如果是这样,我需要更改什么才能完成它?

在 PHP 和 C# 中尝试了多种组合后,我终于让它工作了。在 PHP 中,CURLOPT_POSTFIELDS 需要设置为:

curl_setopt($uch, CURLOPT_POSTFIELDS, json_encode(array("user" => json_encode($user))));

然后,在 C# 中,我需要将 BodyStyle=WebMessageBodyStyle.Bare 更改为 BodyStyle=WebMessageBodyStyle.Wrapped;