2016-03-24 15 views
1

Ich habe einen WCF-Dienst mit einem SOAP-Endpunkt. Ich habe einen REST-Endpunkt hinzugefügt und die Get-Methoden funktionieren einwandfrei. Ich habe Probleme mit einer POST-Methode, die ein Objekt aufnimmt und ein anderes Objekt zurückgibt. Wenn ich in meinem Objekt übergeben, ich diesen Fehler zurück:WCF-Dienst empfängt keine Daten im POST

"Message":"Object reference not set to an instance of an object."

Hier ist der Code ist, den Dienst zu nennen:

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. 
} 

Das RequestGetInventory Objekt wird wie folgt definiert:

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

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

} 

Der Vertrag für den Webservice ist wie folgt definiert:

[OperationContract] 
[WebInvoke(Method = "POST", 
    RequestFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    ResponseFormat = WebMessageFormat.Json)] 
ResponseGetInventory GetInventory(RequestGetInventory Request); 

Ich habe versucht, mit den WebInvoke-Parameter herumspielen, erhielt aber die gleiche Fehlermeldung für alle realisierbaren Versuche.

Und das ist, wie meine web.config eingerichtet ist:

<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> 

Ich bin nicht ganz sicher, was ich falsch mache, weil ich diese mit SOAP feiner nur zugreifen kann. Es sieht so aus, als würde es keine Werte für das Objekt erhalten, das ich übergeben habe, wodurch der Objektreferenzfehler verursacht wird.

Jede Hilfe würde sehr geschätzt werden! Vielen Dank!

+0

Haben Sie versucht, die Einstellung WebInvoke-Eigenschaft UriTemplate = "/ GetInventory" hinzuzufügen? –

+0

Wenn ich das hinzufüge, erhalte ich diesen Fehler: Endpunkte, die 'UriTemplate' verwenden, können nicht mit 'System.ServiceModel.Description.WebScriptEnablingBehavior' verwendet werden. " – xMetalDetectorx

+0

Möchten Sie diesen Dienst verwenden, um AJAX aufzurufen? Wenn nicht, können Sie entfernen aus der Konfiguration: –

Antwort

2

@jstreet hat einen Kommentar gepostet, der am Ende funktioniert hat. Ich habe BodyStyle = WebMessageBodyStyle.WrappedRequest zu BodyStyle = WebMessageBodyStyle.Bare geändert und <enableWebScript/> aus der Konfigurationsdatei entfernt.

Nachdem Sie diese Dinge getan haben, begann es richtig zu funktionieren! Danke @jstreet!