C# WCF服务未在POST中接收数据

C# WCF服务未在POST中接收数据,c#,web-services,wcf,rest,wcf-data-services,C#,Web Services,Wcf,Rest,Wcf Data Services,我有一个带有SOAP端点的WCF服务。我添加了一个REST端点,Get方法工作得很好。我遇到了POST方法的问题,该方法接收一个对象并返回另一个对象。当我传入我的对象时,我返回此错误: “消息”:“对象引用未设置为对象的实例。” 以下是调用该服务的代码: string URL = "http://qa.acct.webservice"; HttpClient client = new HttpClient(); client.BaseAddress = new Uri(URL); // Ad

我有一个带有SOAP端点的WCF服务。我添加了一个REST端点,Get方法工作得很好。我遇到了POST方法的问题,该方法接收一个对象并返回另一个对象。当我传入我的对象时,我返回此错误:

“消息”:“对象引用未设置为对象的实例。”

以下是调用该服务的代码:

string URL = "http://qa.acct.webservice";

HttpClient client = new HttpClient();
client.BaseAddress = new Uri(URL);

// Add an Accept header for JSON format.
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
// HTTP POST
var request = new RequestGetInventory
     {
         BrandIDs = new string[] { "4", "42" },
         AccountID = "9900003"
     };
var resp = client.PostAsJsonAsync("/AxaptaService.svc/rest/GetInventory", request);
response = resp.Result;
if (response.IsSuccessStatusCode)
{
     var temp = response.Content.ReadAsStringAsync().Result;
     MessageBox.Show(temp); //error message received here.
}
RequestGetInventory对象定义如下:

[DataContract]
public class RequestGetInventory
{
    [DataMember]
    public string[] BrandIDs { get; set; }

    [DataMember]
    public string AccountID { get; set; }

}
Web服务的合同定义如下:

[OperationContract]
[WebInvoke(Method = "POST",
    RequestFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    ResponseFormat = WebMessageFormat.Json)]
ResponseGetInventory GetInventory(RequestGetInventory Request);
我尝试使用WebInvoke参数,但在所有可行的尝试中都收到了相同的错误消息

我的web.config就是这样设置的:

<system.serviceModel>
<services>
  <service behaviorConfiguration="" name="Proj.AxaptaUS.WebService.AxaptaService">
    <endpoint address="rest" behaviorConfiguration="webBehavior" binding="webHttpBinding" contract="Proj.Interfaces.Axapta3.IAxaptaService"></endpoint>
    <endpoint address="" binding="basicHttpBinding" contract="Proj.Interfaces.Axapta3.IAxaptaService"></endpoint>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="webBehavior">
      <webHttp helpEnabled="true" />
      <enableWebScript/>
    </behavior>
  </endpointBehaviors>
</behaviors>
<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>

我不完全确定我做错了什么,因为我可以使用SOAP很好地访问它。它似乎没有为我传入的对象获取任何值,从而导致对象引用错误


任何帮助都将不胜感激!谢谢

@jstreet发表了一条评论,最终奏效了。 我将
BodyStyle=WebMessageBodyStyle.WrappedRequest
更改为
BodyStyle=WebMessageBodyStyle.Bare
,并从配置文件中删除了


完成这些操作后,它开始正常工作!谢谢@jstreet

您是否尝试添加设置WebInvoke属性UriTemplate=“/GetInventory”?当我添加该设置时,会出现以下错误:使用“UriTemplate”的终结点不能与“System.ServiceModel.Description.WebScriptEnableingBehavior”一起使用。“它对我来说非常有效,只是我得到了一个空的
{}”
JSON对象,因为显然没有真正的实现。现在,没有设置为对象实例的对象引用应该非常明显,可以通过调试器来确定。在服务定义中,尝试删除
BodyStyle=WebMessageBodyStyle.WrappedRequest
或改用
BodyStyle=WebMessageBodyStyle.Bare
@jstreet成功了!不过我也必须移除它才能成功。