-1

助けが必要です。コード行で例外が発生しています"e_svr.svr = svr;"svrがnullではないため、理由はわかりません。どんな助けでも大歓迎です。オブジェクトのインスタンスをディクショナリに保存しようとしています。

  [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single,ConcurrencyMode=ConcurrencyMode.Multiple)]   
public class EPS_Service : IEPS_Service
{
    public decimal cal;
    static Dictionary<string, EPS_Instance> OpenConnections =
        new Dictionary<string, EPS_Instance>();

    public invoice_data Invoice_to_Client(input_params inputparams)
    {


        EPS_Instance e_svr = new EPS_Instance();
        invoice_data Invoice = new invoice_data();

        if (OpenConnections.TryGetValue(inputparams.VSId + inputparams.Username, out e_svr))
        {
            Trace.WriteLine("FOUND!");
            e_svr.svr.PrepareByMoney(e_svr.ck, inputparams.VSId, inputparams.meter_number, inputparams.amount, 0, ref cal);
            object tr_bl = e_svr.svr.GetInvoiceData(e_svr.ck, e_svr.svr.Confirm(e_svr.ck));
            Invoice.invoice_header = fill_invoice_header(tr_bl);
            Invoice.invoice_body = fill_invoice_body(tr_bl);
            Invoice.invoice_extra = fill_invoice_extra(tr_bl);
            Invoice.invoice_steps = fill_invoice_steps(tr_bl);
            Invoice.invoice_transfer = fill_invoice_transfer(tr_bl);
        }
        else
        {
            Trace.WriteLine("NOT FOUND");
            EPS30Ora.EPS30Svr svr = new EPS30Ora.EPS30Svr();
            if (svr.LogOnEx("EDENOR", inputparams.VSId, inputparams.Username, inputparams.Password, "EPS30Ora", ref inputparams.ck) == EPS30Ora.LogonResult.psOK)
            {
                e_svr.ck = inputparams.ck;
                e_svr.svr = svr; 
                OpenConnections.Add(inputparams.VSId + inputparams.Username, e_svr);
                svr.PrepareByMoney(inputparams.ck, inputparams.VSId, inputparams.meter_number, inputparams.amount, 0, ref cal);
                object tr_bl = svr.GetInvoiceData(inputparams.ck, svr.Confirm(inputparams.ck));
                Invoice.invoice_header = fill_invoice_header(tr_bl);
                Invoice.invoice_body = fill_invoice_body(tr_bl);
                Invoice.invoice_extra = fill_invoice_extra(tr_bl);
                Invoice.invoice_steps = fill_invoice_steps(tr_bl);
                Invoice.invoice_transfer = fill_invoice_transfer(tr_bl);

            }
        }



      return Invoice; 
    }
}
4

1 に答える 1

1

構造体への変更が良い考えかどうかはわかりません。あなたが何をしているのか知っているなら、そうしてください。EPS_Instanceただし、パラメータを超える大きな構造体がOpenConnections.Add在庫をオーバーフローする可能性があることを覚えておいてください。

問題はelse声明にあります。TryGetValuefalse を返す場合、パラメーターoutは null に設定されます。次にこれをやろうとしたら

e_svr.ck = inputparams.ck;

e_svr が null であるため、NullReferenceException が発生します。

の宣言でe_svrは、新しいインスタンスを作成する意味がありません。したがって、コードは次のようになります

EPS_Instance e_svr;
if (OpenConnections.TryGetValue(inputparams.VSId + inputparams.Username, out e_svr))
{
    //...
}
else
{
    e_svr = new EPS_Instance();
    //...
}
于 2013-09-11T17:44:46.663 に答える