2016-08-15 2 views
-2

Ich bin völlig ratlos, schaute über mehrere Foren und Beispiele, von denen Leute ähnliche Probleme hatten, aber ich kann nicht verfolgen, warum ich bekomme diese "System.Net.ProtocolViolationException: Sie müssen ContentLength Bytes schreiben in den Anfrage-Stream vor dem Aufruf von [Begin] GetResponse. " Error. Es passiert in Zeile 206 meines Codes: HttpWebResponse objResponse = (HttpWebResponse) objRequest.GetResponse();WingtipToys Web-Antwort Probleme

wenn jemand könnte mir bitte einfach hier in die richtige Richtung ... versucht, es herauszufinden und seine mich verrückt

Dank!

using System; 
using System.Collections; 
using System.Collections.Specialized; 
using System.IO; 
using System.Net; 
using System.Text; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using WingtipToys; 
using WingtipToys.Models; 
using System.Collections.Generic; 
using System.Linq; 

public class NVPAPICaller 
{ 
//flag that determines the paypal environment (live or sandbox) 
private const bool bSandbox = true; 
private const string CVV2 = "CVV2"; 

//Live strings. 
private string pEndPointURL = "http://api-3t.sandbox.paypal.com/nvp"; 
private string host = "www.paypal.com"; 

//sandbox strings. 
private string pEndPointURL_SB = "http://api-3t.sandbox.paypal.com/nvp"; 
private string host_SB = "www.sandbox.paypal.com"; 

private const string SIGNATURE = "SIGNATURE"; 
private const string PWD = "PWD"; 
private const string ACCT = "ACCT"; 
//replace <Your API username> with your api username 
//replace api pass with pass 
//repalce sig with sig 
public string APIUsername = "deleted"; 
private string APIPassword = "deleted"; 
private string APISignature = "deleted"; 
private string Subject = ""; 
private string BNCode = "PP-ECWizard"; 

//HttpWebRequest Timeout Specified in milliseconds 
private const int Timeout = 15000000; 
private static readonly string[] SECURED_NVPS = new string[] { ACCT, CVV2, SIGNATURE, PWD }; 

public void SetCredentials(string Userid, string Pwd, string Signature) 
{ 
    APIUsername = Userid; 
    APIPassword = Pwd; 
    APISignature = Signature; 
} 

public bool ShortcutExpressCheckout(string amt, ref string token, ref string retMsg) 
{ 
    if(bSandbox) 
    { 
     pEndPointURL = pEndPointURL_SB; 
     host = host_SB; 
    } 

    string returnURL = "http://localhost:17394/Checkout/CheckoutReview.aspx"; 
    string cancelURL = "http://localhost:17394/Checkout/CheckoutCancel.aspx"; 

    NVPCodec encoder = new NVPCodec(); 
    encoder["METHOD"] = "SetExpressCheckout"; 
    encoder["RETURNURL"] = returnURL; 
    encoder["CANCELURL"] = cancelURL; 
    encoder["BRANDNAME"] = "Wingtip Toys Sampe Application"; 
    encoder["PAYMENTREQUEST_0_AMT"] = amt; 
    encoder["PAYMENTREQUEST_0_ITEMAMT"] = amt; 
    encoder["PAYMENTREQUEST_0_PAYMENTACTION"] = "Sale"; 
    encoder["PAYMENTREQUEST_0_CURRENCYCODE"] = "USD"; 

    //get the shopping cart products 

    using (WingtipToys.Logic.ShoppingCartActions myCartOrders = new WingtipToys.Logic.ShoppingCartActions()) 
    { 
     List<CartItem> myOrderList = myCartOrders.GetCartItems(); 

     for (int i = 0; i < myOrderList.Count; i++) 
     { 
      encoder["L_PAYMENTREQUEST_0_NAME" + i] = myOrderList[i].Product.ProductName.ToString(); 
      encoder["L_PAYMENTREQUEST_0_AMT" + i] = myOrderList[i].Product.UnitPrice.ToString(); 
      encoder["L_PAYMENTREQUEST_0_QTY" + i] = myOrderList[i].Quantity.ToString(); 
     } 
    } 


    string pStrrequestforNvp = encoder.Encode(); 
    string pStresponsenvp = HttpCall(pStrrequestforNvp); 

    NVPCodec decoder = new NVPCodec(); 
    decoder.Decode(pStresponsenvp); 

    string strAck = decoder["ACK"].ToLower(); 
    if (strAck != null && (strAck == "success" || strAck == "successwithwarning")) 
    { 
     // token = decoder["TOKEN"]; 
     // string ECURL = "http://" + host + "/cgi-bin/webscr?cmd=_express-checkout" + "&token=" + token; 
     // retMsg = ECURL; 
     return true; 
    } 
    else 
    { 
     retMsg = "ErrorCode=" + decoder["L_ERRORCODE0"] + "&" + "Desc=" + decoder["L_SHORTMESSAGE0"] + "&" + 
      "Desc2=" + decoder["L_LONGMESSAGE0"]; 
     return false; 
    } 
} 

public bool GetCheckoutDetails(string token, ref string PayerID, ref NVPCodec decoder, ref string retMsg) 
{ 
    if (bSandbox) 
    { 
     pEndPointURL = pEndPointURL_SB; 
    } 

    NVPCodec encoder = new NVPCodec(); 
    encoder["METHOD"] = "GetExpressCheckoutDetails"; 
    encoder["TOKEN"] = token; 


    string pStrrequestforNvp = encoder.Encode(); 
    string pStresponsenvp = HttpCall(pStrrequestforNvp); 

    decoder = new NVPCodec(); 
    decoder.Decode(pStresponsenvp); 

    string strAck = decoder["ACK"].ToLower(); 
    if (strAck != null & (strAck == "success" || strAck == "successwithwarning")) 
    { 
     PayerID = decoder["PAYERID"]; 
     return true; 
    } 
    else 
    { 
     retMsg = "ErrorCode=" + decoder["L_ERRORCODE0"] + "&" + "Desc=" + decoder["L_SHORTMESSAGE0"] + "&" + "Desc2=" + decoder["L_LONGMESSAGE0"]; 
     return false; 
    } 
} 

public bool DoCheckoutPayment(string finalPaymentAmount, string token, string PayerID, ref NVPCodec decoder, ref string retMsg) 
{ 
    if (bSandbox) 
    { 
     pEndPointURL = pEndPointURL_SB; 
    } 

    NVPCodec encoder = new NVPCodec(); 
    encoder["METHOD"] = "DoExpressCheckoutPayment"; 
    encoder["TOKEN"] = token; 
    encoder["PAYERID"] = PayerID; 
    encoder["PAYMENTREQUEST_0_AMT"] = finalPaymentAmount; 
    encoder["PAYMENTREQUEST_0_CURRENCYCODE"] = "USB"; 
    encoder["[AYMENTREQUEST_0_PAYMENTACTION"] = "Sale"; 

    string pStrrequestforNvp = encoder.Encode(); 
    string pStresponsenvp = HttpCall(pStrrequestforNvp); 

    decoder = new NVPCodec(); 
    decoder.Decode(pStresponsenvp); 

    string strAck = decoder["ACK"].ToLower(); 
    if(strAck != null && (strAck == "success" || strAck == "successwithwarning")) 
    { 
     return true; 
    } 
    else 
    { 
     retMsg = "ErrorCode=" + decoder["L_ERRORCODE0"] + "&" + "Desc=" + decoder["L_SHORTMESSAGE0"]; 

     return false; 
    } 
} 

public string HttpCall(string NvpRequest) 
{ 
    string url = pEndPointURL; 

    string strPost = NvpRequest + "&" + buildCredentialsNVPString(); 
    strPost = strPost + "&BUTTONSOURCE=" + HttpUtility.UrlEncode(BNCode); 
    // ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11; //Thank you stack overflow 

    HttpWebRequest objRequest = (HttpWebRequest)WebRequest.Create(url); 
    objRequest.Timeout = Timeout; 
    objRequest.Method = "POST"; 
    objRequest.ContentLength = strPost.Length; 




    try 
    { 
     using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream())) 
     { 
      myWriter.Write(strPost); 
     } 
    } 
    catch (Exception) 
    { 
     //No logging for this tutorial 
    } 

    try 
    { 
     //Retrieve the Response returned from the NVP API call to PayPal. 
     HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse(); 

     string result; 

     using (StreamReader sr = new StreamReader(objResponse.GetResponseStream())) 
     { 
      result = sr.ReadToEnd(); 
     } 

     return result; 
    } 
    catch (WebException ex) 
    { 
     using (var stream = ex.Response.GetResponseStream()) 
     using (var reader = new StreamReader(stream)) 
     { 
      Console.WriteLine(reader.ReadToEnd()); 
     } 
    } 
+0

Hallo und willkommen Stack Zeit für eine [tour] Overflow.Please nehmen (http://stackoverflow.com // tour) und besuchen Sie die [Hilfe] (http://stackoverflow.com//help). Vielleicht möchten Sie auch lesen [Wie zu fragen] (http://stackoverflow.com//questions/how-to-ask). – Marusyk

+1

Mögliches Duplikat von [System.Net.ProtocolViolationException: Sie müssen ContentLength-Bytes vor dem Aufruf von \ [Begin \] GetResponse in den Anforderungsstream schreiben (http://stackoverflow.com/questions/31297612/system-net-protocolviolationexception-you- muss schreiben-contentlength-bytes-to-the) – DeanOC

Antwort

0

Sie tun einige Dinge falsch. Sie shuold den Anfrag Text umwandeln, das byteArray und gibt zum Schreiben zu streamen und dann rufen GetResponse() wie

var arr = System.Text.Encoding.UTF8.GetBytes(strPost); 

objRequest.ContentLength = arr.Length; 

    try 
    { 
     using (StreamWriter myWriter = new StreamWriter(objRequest.GetRequestStream())) 
     { 
      myWriter.Write(arr, 0, arr.Length); 
     } 
    }