WebApi - 已发送的 Guid 作为新的 Guid

WebApi - Sent Guid taken as a new Guid

我有一个 ApiController class 的方法接受一个复杂的对象。

public class SampleController : ApiController
{
    [Route("api/Sample/")]
    [HttpPost]
    public HttpResponseMessage GetSampleInfo([FromBody]SampleClass sampleClassObject)
    {
        // Some code
    }
}

调试时调用了这个Controllerclass方法,但是在对象中作为Guid传递的,显示了一个新的Guid(作为00000000-0000-0000-0000-000000000000).我首先使用 Postman 检查此方法。我尝试使用 x-www-form-urlencodedapplication/json 传递对象。

我传递的内容邮递员:

{
   "sampleID": "A9A999AA-AA99-9AA9-A999-9999999999AA",
   "otherValue": 1
}

我检查了其他类似我的问题,但我已经尝试了解决方案,但我仍然将通过的 Guid 作为新的 Guid

P.S。 SampleClass 如下所示:

public class SampleClass
{
    public Guid sampleID { get; set; }
    public int otherValue { get; set; }
}

更新:

下面的我用过JsonConverter.

public class GuidConverterCustom : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return typeof(Guid) == objectType;
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        switch (reader.TokenType)
        {
            case JsonToken.Null:
                return Guid.Empty;
            case JsonToken.String:
                string str = reader.Value as string;
                if (string.IsNullOrEmpty(str))
                {
                    return Guid.Empty;
                }
                else
                {
                    return new Guid(str);
                }
            default:
                throw new ArgumentException("Invalid token type");
        }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        if (Guid.Empty.Equals(value))
        {
            writer.WriteValue("");
        }
        else
        {
            writer.WriteValue((Guid)value);
        }
    }
}

并在 Global.asax.cs 中包含以下内容:

JsonConvert.DefaultSettings = () =>
{
    var settings = new JsonSerializerSettings();
    settings.Converters.Add(new GuidConverterCustom());
    return settings;
};

您的方法应该如下所示,无需自定义 JsonConverter。

[Route("sample")]
[HttpPost]
public IHttpActionResult PostGuid(SampleClass id)
{
    return Ok();
}

然后它适用于 x-www-form-urlencodedapplication/json。如果你使用 json 不要忘记 header Content-Type: application/json.