无需等待回调即可调用WCF服务

时间:2017-11-06 13:19:08

标签: c# wcf asynchronous

我使用WCF创建了一个服务来保存系统的日志历史记录。我的想法是异步调用此服务,如果日志服务处于脱机状态,主系统无需等待返回。

我在我的方法中添加了参数isOneWay,如下所示:

[OperationContract(IsOneWay=true)]
void Gravar(AuditoriaDTO objeto);

我的服务非常简单,只需将对象保存在数据库中:

internal void Gravar(AuditoriaDTO objeto)
{
    try
    {
    StringBuilder strSql = new StringBuilder();

    strSql.Append("INSERT INTO ACECPGER_LOG.AUDITORIA");
    strSql.Append("       (COD_SISTEMA");
    strSql.Append("       ,COD_MODULO");
    strSql.Append("       ,COD_PROJETO");
    strSql.Append("       ,DSC_CLASSE");
    strSql.Append("       ,DSC_METODO");
    strSql.Append("       ,COD_RESULTADO");
    strSql.Append("       ,DSC_RESULTADO");
    strSql.Append("       ,DSC_STACKTRACE");
    strSql.Append("       ,DTH_INICIO");
    strSql.Append("       ,DTH_FIM");
    strSql.Append("       ,DSC_USUARIO)");
    strSql.Append(" VALUES");
    strSql.Append("       (:COD_SISTEMA");
    strSql.Append("       ,:COD_MODULO");
    strSql.Append("       ,:COD_PROJETO");
    strSql.Append("       ,:DSC_CLASSE");
    strSql.Append("       ,:DSC_METODO");
    strSql.Append("       ,:COD_RESULTADO");
    strSql.Append("       ,:DSC_RESULTADO");
    strSql.Append("       ,:DSC_STACKTRACE");
    strSql.Append("       ,:DTH_INICIO");
    strSql.Append("       ,:DTH_FIM");
    strSql.Append("       ,:DSC_USUARIO)");

    using (AcessoDadosOracle acessoDados = new AcessoDadosOracle())
    {
        acessoDados.AdicionarParametro(":COD_SISTEMA", objeto.Sistema.Codigo);
        acessoDados.AdicionarParametro(":COD_MODULO", objeto.Modulo.Codigo);
        acessoDados.AdicionarParametro(":COD_PROJETO", objeto.Projeto.Codigo);
        acessoDados.AdicionarParametro(":DSC_CLASSE", objeto.Classe);
        acessoDados.AdicionarParametro(":DSC_METODO", objeto.Metodo);
        acessoDados.AdicionarParametro(":COD_RESULTADO", objeto.CdResultado);
        acessoDados.AdicionarParametro(":DSC_RESULTADO", objeto.Resultado);
        acessoDados.AdicionarParametro(":DSC_STACKTRACE", objeto.StackTrace);
        acessoDados.AdicionarParametro(":DTH_INICIO", objeto.DataInicio);
        acessoDados.AdicionarParametro(":DTH_FIM", objeto.DataFim);
        acessoDados.AdicionarParametro(":DSC_USUARIO", objeto.Usuario);

        acessoDados.ExecuteNonQuery(strSql.ToString());
    }
}
catch (Exception ex)
{
    throw ex;
}
}

在通话中,我会执行以下操作:

using (AuditoriaService.AuditoriaClient servico = new AuditoriaService.AuditoriaClient())
{
    try
    {
        servico.GravarAsync(objeto);
    }
    catch (Exception ex)
    {
         throw ex;
    }
}

在我的测试期间,我在服务中添加了断点,应用程序等待几秒钟以继续其他操作。我需要应用程序不要等待1秒钟才能返回服务。这可能吗?你应该怎么做?

我的服务参考配置如下:

enter image description here

0 个答案:

没有答案