C# 500使用XML调用Web API时出错

C# 500使用XML调用Web API时出错,c#,.net,xml,asp.net-web-api,C#,.net,Xml,Asp.net Web Api,我在.NET4.5中开发了一个web api。当我测试api调用时,我得到一个500错误。这种行为只有在我发送XML时才会发生。如果我使用格式为URL编码字符串的JSON,服务器将正确处理请求 我补充说 GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 到WebApiConfig.cs,返回的错误为: <Error><Message>

我在.NET4.5中开发了一个web api。当我测试api调用时,我得到一个500错误。这种行为只有在我发送XML时才会发生。如果我使用格式为URL编码字符串的JSON,服务器将正确处理请求

我补充说

GlobalConfiguration.Configuration.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
到WebApiConfig.cs,返回的错误为:

<Error><Message>An error has occurred.</Message><ExceptionMessage>Object reference not set to an instance of an object.</ExceptionMessage><ExceptionType>System.NullReferenceException</ExceptionType><StackTrace>   at System.Web.Http.ApiController.&lt;InvokeActionWithExceptionFilters&gt;d__1.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
  at System.Web.Http.Dispatcher.HttpControllerDispatcher.&lt;SendAsync&gt;d__0.MoveNext()</StackTrace></Error>
我的要求是:

<Admin.CardListRequest>
<username>TestUser</username>
<password>GoodPassword</password>
</Admin.CardListRequest>
WebAPI代码如下所示(日志使用的是log4net,没有任何内容写入该日志):

//
///获取未结持卡人的列表
/// 
///用于登录pexcardadmin.com的用户名
///用于登录pexcardadmin.com的密码
///有余额的持卡人名单
[HttpGet]
公共列表卡片列表(字符串用户名、字符串密码)
{
尝试
{
log.Info(String.Format(“管理员参数:”,用户名));
AuthenticateApi(用户名、密码、“卡片列表”);
var Ret=GetCoreCardList(用户名、密码);
APIData.Response=“成功”;
返回Ret;
}
捕获(例外e)
{
日志错误(e);
APIData.Response=e.Message;
投掷e;
}
最后
{
APIData.ResponseTime=DateTime.Now;
LogAPI(APIData);
}
}
/// 
///获取未结持卡人的列表
/// 
///请求参数
///有余额的持卡人名单
[HttpPost]
公共列表CardList(Admin.CardListRequest请求)
{
APIData.ParamBlob=JsonConvert.SerializeObject(Req);
返回卡片列表(请求用户名、请求密码);
}
有人知道为什么会抛出这个错误吗

谢谢,
Steven

通过确保XML是正确的解决了这一问题。为此,我创建了一个新的web api函数,该函数具有我想要的返回类型和我想要填写的字段,并使用该确切响应发送到web api。

显示处理请求的web api代码我已将代码添加到原始帖子中。
<Admin.CardListRequest>
<username>TestUser</username>
<password>GoodPassword</password>
</Admin.CardListRequest>
public class CardListRequest{
    public string UserName { get; set; }
    public string Password { get; set; }
}
    /// <summary>
    /// Gets the list of open cardholders
    /// </summary>
    /// <param name="UserName">The username you use to log on to pexcardadmin.com</param>
    /// <param name="Password">The password you use to log on to pexcardadmin.com</param>
    /// <returns>A list of cardholders with balances</returns>
    [HttpGet]
    public List<Admin.Account> CardList(string UserName, string Password)
    {
        try
        {

            log.Info(String.Format("Admin Parameters: <UserName={0}>", UserName));
            AuthenticateApi(UserName, Password, "cardList");
            var Ret = GetCoreCardCardList(UserName, Password);
            APIData.Response = "Success";


            return Ret;
        }
        catch (Exception e)
        {
            log.Error(e);
            APIData.Response = e.Message;
            throw e;
        }
        finally
        {
            APIData.ResponseTime = DateTime.Now;
            APILog.LogAPI(APIData);
        }

    }
    /// <summary>
    /// Gets the list of open cardholders
    /// </summary>
    /// <param name="Req"> The Request Parameter</param>
    /// <returns>A list of cardholders with balances</returns>
    [HttpPost]
    public List<Admin.Account> CardList(Admin.CardListRequest Req)
    {
        APIData.ParamBlob = JsonConvert.SerializeObject(Req);
        return CardList(Req.UserName, Req.Password);

    }