使用POST将DTO压到ServiceStack

时间:2017-03-11 21:06:44

标签: servicestack

在我的服务中,我有以下要求:

[Route(@"/api/adddevice", Verbs = "POST")]
public class AddDeviceRequest : IReturn<AddDeviceResponse> 
{
    public DTOTargetDevice TargetDevice { get; set; }
}   

它使用以下DTO:

public class DTOTargetDevice
{
    private string _guid = string.Empty;
    public string GUID
    {
        get { return _guid; }
        set { _guid = DTOUtils.GetGUID(value); }
    }

    public string Type { get; set; }
    public string DeviceName { get; set; }
    public string[] PropertiesName { get; set; }
    public string[] PropertiesValue { get; set; }
}

从C#客户端,一切正常,但是当我尝试调用它时,TargetDevice始终为null。 这是我使用的javascript代码:

        var parms = {};
    parms.targetDevice = {};
    parms.targetDevice.guid=guid();
    parms.targetDevice.deviceName = guid();
    parms.targetDevice.type = sDeviceType;
    parms.targetDevice.propertiesName = (propsName);
    parms.targetDevice.propertiesValue = (propsValue);
    var config = {
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8;'
        }
    }
    var promise = $http.post("http://" + sIP + ":20001/api/adddevice", parms, config).then(function (response) {
        var result = response.data.result;
        console.log("Added Device: " + result);
        return result;
    });

这是json,取自Chrom Developer窗口:

  

{&#34; targetDevice&#34; {&#34; GUID&#34;:&#34; e7461703-1b4b-7cd3-6263-3ac0935fb6f7&#34;&#34; DEVICENAME&#34;:& #34; 11e08b8f-d030-8f69-a469-4a1300aa49bf&#34;&#34;类型&#34;:&#34; HTTPDevice&#34;&#34; propertiesName&#34;:[&#34;名称&# 34;,&#34;缩写&#34],&#34; propertiesValue&#34;:[&#34;装置&#34;&#34;装置&#34;]}}:

我已经尝试了几个选项,但我总是在请求中的TargetDevice上收到一个空例外。

我已经在其他主题中读过简单对象是首选,但在其他服务中我有更复杂的DTO。 你有什么建议吗?

由于 利奥

2 个答案:

答案 0 :(得分:3)

我在引用你:

  
    

这是json,取自Chrom Developer窗口:

  

您的句子中的重要字词是: json 。因此,请确保在提出请求时指定正确的内容类型。您需要在声称要发送的内容以及实际发送到服务器的内容中保持一致:

var config = {
    headers: {
        'Content-Type': 'application/json'
    }
};

在您的示例中,您声称要发送application/x-www-form-urlencoded;charset=utf-8;然后转储JSON字符串,您希望服务器如何能够应对这种混乱?

我想Angular或您使用的任何$http.post函数会自动JSON.stringify parms对象,然后再将其发送到服务器。也许它甚至会自动添加application/json内容类型请求标头,因此在这种情况下你可以完全摆脱你的config变量。

答案 1 :(得分:1)

解决。 而不是在SetConfig()中使用

<!DOCTYPE HTML>
<head>
</head>
<body> 
<script>
(function(d, s, id){
  var js, fjs = d.getElementsByTagName(s)[0];
  if (d.getElementById(id)) {return;}
  js = d.createElement(s); js.id = id;
  js.src = "//connect.facebook.com/en_US/messenger.Extensions.js";
  fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'Messenger'));

window.extAsyncInit = function () {
    // the Messenger Extensions JS SDK is done loading
    MessengerExtensions.getUserID(function success(uids) {
        var psid = uids.psid;
        alert(psid);
    }, function error(err) {
        alert("Messenger Extension Error: " + err);
    });
};
</script>  
<h2>Test</h2>
</body>

我已经使用过:

                GlobalResponseHeaders =
            {
                { "Access-Control-Allow-Origin", "*" },
                { "Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS" },
                { "Access-Control-Allow-Headers", "Content-Type" },
            },

谢谢你们! LEO