如何从wcf Web服务中逃避反斜杠?

时间:2014-04-21 10:06:08

标签: c# asp.net json web-services wcf

您好我的wcf webservice如下

  public string GetValues(int CompanyCode)
        {
            Logger.EnterFunction();
            string value = "[";
            try
            {
                Logger.EnterFunction();
                int Comppany = CheckCompanyValid(CompanyCode);
                if (Comppany == 1)
                {

                    value += "{";

                    value +=  "IncomeAmount:" + GetIncomeAmount(CompanyCode).ToString();
                    value += ",\"ExpenseAmount\":" + GetExpenseAmount(CompanyCode).ToString().Trim();
                    value += ",\"NetProfitLossAmount\":" + GetNetProfitLoss(CompanyCode);
                    value += ",\"CustomerOutStanding\":" + GetCustomerOutStanding(CompanyCode);
                    value += ",\"SupplierOutStanding\":" + GetSupplierOutStanding(CompanyCode);
                    value += ",\"CorporationTaxAmount\":" + GetCorporationTaxAmount(CompanyCode);
                    value += ",\"VATAmount\":" + GetVATAmount(CompanyCode);
                    value += ",\"PayeAmount\":" + GetPayeAmount(CompanyCode);
                    value += ",\"NumberOfBankTransactionUnProcessed\":" + GetNumberOfBankTransactionUnProcessed(CompanyCode);
                    value += ",\"NumberOfQueries\":" + GetNumberOfQueries(CompanyCode);
                    value += ",\"ReserveValue\":" + GetReserveValue(CompanyCode);   
                    value += ",\"AllBankBalance\":" + GetAllBankBalance(CompanyCode) + "}";
                }
            }
            catch (Exception ex)
            {
                Logger.Error(ex);
            }
            value += "]";
            Logger.LeaveFunction();

            return value;

        }

哪个好,并运行以下输出

"[{IncomeAmount:117730.8400,\"ExpenseAmount\":43391.5400,\"NetProfitLossAmount\":74339.3000,\"CustomerOutStanding\":107541.0400,\"SupplierOutStanding\":6173.6700,\"CorporationTaxAmount\":1000.0000,\"VATAmount\":700.0000,\"PayeAmount\":3250.0000,\"NumberOfBankTransactionUnProcessed\":22,\"NumberOfQueries\":2,\"ReserveValue\":(73339.30),\"AllBankBalance\":5299.5800}]"

没有问题,但我的问题是我不想要从一天中杀死我的斜线 我尝试过很多东西,比如逃避替换和使用 memorystream ,但有些事情仍然保持不变

我知道newtonsoft.dll但我无法使用它 我希望我能清楚地解释你......提前感谢.......

还有一件事要补充 我也尝试过使用类,但结果仍然相同............

3 个答案:

答案 0 :(得分:2)

你在哪里读取输出字符串?

您提供的代码对我来说是正确的,假设您希望",\"NetProfitLossAmount\":"呈现为","NetProfitLossAmount":" - 这就是\字符的用途;它逃脱了#34;这样它就被视为字符串的一部分,而不是终结符。 Visual Studio调试工具倾向于以转义形式表示字符串,以便您可以轻松地将它们粘贴回C#并使其按预期工作。要检查服务是否真的返回了您期望的文本,请将结果写入文件,然后查看 的内容。

答案 1 :(得分:1)

问题是你是否使用了一个字符串作为返回类型,你真的想要返回一个json对象。由于字符串包含你的json,DataContractJsonSerializer转义了双引号,以防止客户混淆。

如果您创建了一个正确的DataTransferObject,则可以完全放大DataContractJsonSerializer,而无需在当前解决方案中自定义所有序列化字符串的构建。

需要进行以下更改:

  • 添加包含属性的公司类
  • 使用新的返回类型GetValues
  • 更改界面
  • 调整GetValues的实现以返回公司类数组

公司类

[DataContract]
public class Company
{
    [DataMember]
    public int IncomeAmount { get; set; }
    [DataMember]
    public int ExpenseAmount { get; set; }
    /// add the other properties your self
}

服务接口

请注意,您必须返回一组公司类!

[WebGet(
    UriTemplate = "/GetValues?CompanyCode={CompanyCode}", 
    BodyStyle = WebMessageBodyStyle.Bare,  
    RequestFormat =  WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json)]
Company[] GetValues(int CompanyCode);

服务实施

public Company[] GetValues(int CompanyCode)
{
    Logger.EnterFunction();
    var companies = new Company[1];
    try
    {
        Logger.EnterFunction();
        int Comppany = CheckCompanyValid(CompanyCode);
        if (Comppany == 1)
        {
            companies[0] = new Company
                {
                    IncomeAmount = GetIncomeAmount(CompanyCode),
                    ExpenseAmount = GetExpenseAmount(CompanyCode),
                    // etc add your other properties here
                };
        }
    }
    catch (Exception ex)
    {
        Logger.Error(ex);
    }
    Logger.LeaveFunction();
    return companies;
}

验证

如果请求的Content-Type标头也是json类型,WCF / http管道将返回一个json字符串。使用像Fiddler这样的低级别httprequestbuilder来模拟它。

请求

  

GET /Service1.svc/GetValues?CompanyCode=3 HTTP / 1.1
  用户代理:Fiddler
  内容类型:application / json
  主持人:localhost:42369

<强>响应

  

[{&#34; ExpenseAmount&#34;:3,&#34; IncomeAmount&#34; 42}]

答案 2 :(得分:0)

看起来应该是

  [OperationContract]
        [WebGet(UriTemplate = "GetValues?CompanyCode={CompanyCode}")]
        Stream GetValues(int CompanyCode);

并从方法

 value += "]";
            Logger.LeaveFunction();
            WebOperationContext.Current.OutgoingResponse.ContentType = "text/json";
            string json =(value);   
            return new MemoryStream(Encoding.UTF8.GetBytes(json));

如果你不使用流,你的输出将没有布料,所以它应该被内存流包围,这将为你提供纯粹的输出,因为我需要......谢谢