在生成的服务参考中公开请求方法

Exposing request method in generated Service Reference

在生成的服务参考(从 WSDL 导入)中,我在客户端 class 中有以下方法,在 Reference.cs:

    public Namespace.Service.SalesOrderDetail newService(Namespace.Service.Contact orderContact, Namespace.Service.Contact installationContact, string customerReference, Namespace.Service.ServiceDetails[] serviceDetailsList) {
        Namespace.Service.newServiceRequest inValue = new Namespace.Service.newServiceRequest();
        inValue.orderContact = orderContact;
        inValue.installationContact = installationContact;
        inValue.customerReference = customerReference;
        inValue.serviceDetailsList = serviceDetailsList;
        Namespace.Service.newServiceResponse retVal = ((Namespace.Service.ServiceRequestPortType)(this)).newService(inValue);
        return retVal.salesOrder;
    }

    [System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
    System.Threading.Tasks.Task<Namespace.Service.newServiceResponse> Namespace.Service.ServiceRequestPortType.newServiceAsync(Namespace.Service.newServiceRequest request) {
        return base.Channel.newServiceAsync(request);
    }

    public System.Threading.Tasks.Task<Namespace.Service.newServiceResponse> newServiceAsync(Namespace.Service.Contact orderContact, Namespace.Service.Contact installationContact, string customerReference, Namespace.Service.ServiceDetails[] serviceDetailsList) {
        Namespace.Service.newServiceRequest inValue = new Namespace.Service.newServiceRequest();
        inValue.orderContact = orderContact;
        inValue.installationContact = installationContact;
        inValue.customerReference = customerReference;
        inValue.serviceDetailsList = serviceDetailsList;
        return ((Namespace.Service.ServiceRequestPortType)(this)).newServiceAsync(inValue);
    }

我见过 Python 使用相同 WSDL 的代码,它能够像 response = client.newService(request) 那样访问方法。

我也想以那种方式访问​​该方法,尽管 var task = client.newService(request); Task.WaitAll(task); var response = task.Result;,但我似乎无法找到创建服务引用的正确组合,而不必被迫扩展输入参数到服务。

是否有创建服务引用的神奇组合,允许我将请求作为单个对象传递?

我对保留异步功能并不着急。

服务的客户端实现代表该服务的接口。它恰好发生了,并在此示例中显示,它不一定使所有那些已实现的方法 public.

因此,为了解决这个问题,如果我将客户端对象转换为服务接口,我就可以按预期调用服务,而不管客户端做了什么public。

var client = new ServiceClient();

var service = (Service)client;

var request = new newServiceRequest() { ... };

var response = service.newService(request);

client.Close();