POST-verzoek aan de WCF-service door het gebruik van HttpWebRequest

Mijn servicecontract

[ServiceContract]
public interface ITsdxService
{
    [OperationContract]
    [WebGet(UriTemplate="/GetTestCostCentre")]
    CostCentre GetTestCostCentre();

    [OperationContract]
    [WebInvoke(UriTemplate="/SetCostCentre", Method="POST")]
    string SetCostCentre(CostCentre cc);
}

public class TsdxService : ITsdxService
{
    public CostCentre GetTestCostCentre()
    {
        CostCentre cc = new CostCentre();
        cc.Code = "Test";
        cc.Name = "Test Cost Centre";
        cc.Description = new byte[] { 12, 34, 89, 240, 66, 87, 189 };
        cc.SAPStatus = "Existent";
        cc.SAPSiteFolder = "Folder1";
        return cc;
    }

    public string SetCostCentre(CostCentre cc)
    {
        return cc.Code;
    }
}

Dan start ik deze service en probeer ik ermee te werken vanuit verschillende applicaties:

Uri requestUri = new Uri(textBox1.Text + "/tsdx/GetTestCostCentre");

HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest;
XElement root;

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());
    root = XElement.Parse(reader.ReadToEnd());
    textBox2.Text = root.ToString();
}

Alles is goed, ik krijg het XML-document. Maar ik heb een probleem gehad toen ik probeerde een POST-verzoek naar deze service te verzenden:

Uri requestUri = new Uri(textBox1.Text + "/tsdx/SetCostCentre");

HttpWebRequest request = WebRequest.Create(requestUri) as HttpWebRequest;

byte[] bytes = Encoding.UTF8.GetBytes(textBox2.Text);

request.ContentLength = bytes.Length;
request.Method = "POST";

Stream dataStream = request.GetRequestStream();
dataStream.Write(bytes, 0, bytes.Length);
dataStream.Close();

using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
    StreamReader reader = new StreamReader(response.GetResponseStream());
    textBox2.Text = reader.ReadToEnd();
}

Uitzondering: de externe server heeft een fout geretourneerd: (400) Ongeldig verzoek.

Wat heb ik verkeerd gedaan?

2
Waarom u de AddServiceReference niet gebruikt in VisualStudio en de gegenereerde proxy gebruikt. Ik vraag dit omdat je C# gebruikt voor client-side ...
toegevoegd de auteur Beygi, de bron
@Beygi Onze klant zal Java hiervoor gebruiken en ik wil deze service alleen zelf testen.
toegevoegd de auteur Don Tomato, de bron

2 antwoord

Wijzig uw klantcode als volgt

byte[] bytes = Encoding.UTF8.GetBytes(@"
                                                      String content
                                                      QmFzZSA2NCBTdHJlYW0=
                                                      String content
                                                      String content
                                                      String content
                                                    ");

request.ContentLength = bytes.Length;
request.Method = "POST";
request.ContentType = "application/xml";

Nu gaat het goed.

En ik denk ook dat Java WCF BasicHttpBinding ondersteunt en dat u WCF-services kunt gebruiken met behulp van de door Java geleverde tools om proxy voor webservices te genereren op een eenvoudige manier.

2
toegevoegd
@DonTomato ik ben heel erg blij om u te helpen ...
toegevoegd de auteur Beygi, de bron
Wauw, heel erg bedankt !! Nu zie ik dat het probleem was dat ik request.ContentType = "application/xml"; string niet zou toevoegen.
toegevoegd de auteur Don Tomato, de bron

Een ander ding dat u misschien wilt doen, is ClientBase uitbreiden om al het harde werk te doen om xml voor u te serialiseren. Vooral als je meer dan één berichtindeling zoals json wilt ondersteunen, wordt je leven een stuk eenvoudiger en worden wijzigingen aan de interface gecompileerd met tijdfouten in plaats van runtime-fouten.

public class ITsdxServiceProxy : ClientBase, ITsdxService {

    #region ITsdxService Members

    public CostCentre GetTestCostCentre() {
        return Channel.GetTestCostCentre();
    }

    public string SetCostCentre(CostCentre cc) {
        return Channel.SetCostCentre(cc);
    }

    #endregion
}

gebruik aan clientzijde

var proxy = new ITsdxServiceProxy();
var costCenter = proxy.GetTestCostCentre();

Configuratie aan clientzijde



   
    
      
    
  



  
      



0
toegevoegd