The formatting is created by the following code on the response class
- Code: Select all
#region "Response Classes"
[Serializable]
[DataContract]
public class DebtorOPEAFileExportResponse
{
[DataMember]
public string CompanyID {get; set;}
[DataMember]
public DateTime EffectiveDate {get; set;}
[DataMember]
public string PartNo {get; set;}
[DataMember]
public string Description {get; set;}
[DataMember]
public double Price {get; set;}
[DataMember]
public bool GST {get; set;}
[DataMember]
public double RRPrice {get; set;}
[DataMember]
public string DiscountCode {get; set;}
[DataMember]
public string SupersededPartNo {get; set;}
[DataMember]
public bool Active {get; set;}
[DataMember]
public string StockingCode {get; set;}
[DataMember]
public double MOQ {get; set;}
[DataMember]
public string Class {get; set;}
[DataMember]
public string Filler {get; set;}
public DebtorOPEAFileExportResponse()
{
CompanyID = "";
EffectiveDate = DateTime.Now;
PartNo = "";
Description = "";
Price = 0;
GST = false;
RRPrice = 0;
DiscountCode = "";
SupersededPartNo = "";
Active = false;
StockingCode = "";
MOQ = 0;
Class = "";
Filler = "";
}
public string Formated()
{
string result = "";
result += CompanyID.OPEAPadRight(4);
result += EffectiveDate.ToString("yyMMdd").OPEAPadRight(6);
result += PartNo.OPEAPadRight(20);
result += Description.OPEAPadRight(35);
result += (Price *100).OPEARoundedString(0).OPEAPadLeft(10, '0');
result += (RRPrice *100).OPEARoundedString(0).OPEAPadLeft(10, '0');
result += DiscountCode.OPEAPadRight(2);
result += SupersededPartNo.OPEAPadRight(20);
result += Active ? "A" : "N";
result += GST ? "1" : "0";
result += StockingCode.OPEAPadRight(1);
result += MOQ.OPEARoundedString(0).OPEAPadRight(4);
result += Class.OPEAPadRight(4);
result += Filler.OPEAPadRight(8);
byte[] asciiString = System.Text.Encoding.ASCII.GetBytes(result);
result = System.Text.Encoding.ASCII.GetString(asciiString);
return result;
}
}
public static class ExtHelper
{
public static string OPEAPadLeft(this string str, int TotalWidth, char PadChar = ' ')
{
return str.PadLeft(TotalWidth, PadChar).Substring(0, TotalWidth);
}
public static string OPEAPadRight(this string str, int TotalWidth, char PadChar = ' ')
{
string strPadded = str.PadRight(TotalWidth, PadChar);
return strPadded.Substring(strPadded.Length - TotalWidth, TotalWidth);
}
public static string OPEARoundedString(this double val, int decimals)
{
return Math.Round(val, decimals).ToString();
}
}
and the service code is
- Code: Select all
[Authenticate]
[AddHeader(ContentType = "text/plain")]
[AddHeader(HttpHeaders.ContentDisposition, "attachment;filename=CASOPEA.txt")]
public byte[] Get(DebtorOPEAFileFormattedExport request)
{
//System.Diagnostics.Debugger.Launch();
List<DebtorOPEAFileExportResponse> iresults = this.Get( new DebtorOPEAFileExportRequest());
System.IO.MemoryStream ms = new System.IO.MemoryStream();
System.IO.StreamWriter sw = new System.IO.StreamWriter(ms, System.Text.Encoding.ASCII );
int icount = iresults.Count;
int i = 1;
foreach(DebtorOPEAFileExportResponse resp in iresults)
{
if(i < icount)
{
sw.Write(resp.Formated() + System.Environment.NewLine);
}
else
{
sw.Write(resp.Formated());
}
i++;
}
sw.Flush();
return ms.ToArray();
}
I have added the code to set the stream writer's encoding today as well forcing the formatted string to be encoded to ASCII and yet they claim within the one file they are getting data that is encoded as ASCII and some encoded as UTF-8 which I would have thought was impossible.
Any ideas on how to resolve this?