UploadStringAsync CallBack返回类型

时间:2015-07-16 07:30:56

标签: c# web-services asynchronous return-type uploadstring

我有一个Web服务,我在那里以异步方式发布到URL

public Response uploadXMLData(string destinationUrl, string requestXml,Request req)
{
    try
    {
        Response resp=new Response();
        System.Uri uri = new System.Uri(destinationUrl);
        using (WebClient client = new WebClient())
        {

            client.UploadStringCompleted
       += new UploadStringCompletedEventHandler(UploadStringCallback); 

            client.UploadStringAsync(uri, "POST",requestXml,req);
        }
    }

    catch (Exception ex)
    {}

    return resp;
}

public void UploadStringCallback(object sender, UploadStringCompletedEventArgs e)
{
    Response resp=new Response();
    Request req = new Request();
    try 
    {
        if (e.Error != null)
        {
            object objException = e.Error.GetBaseException();

            Type _type = typeof(WebException);
            if (_type != null)
            {
                WebException objErr = (WebException)e.Error.GetBaseException();
                WebResponse rsp = objErr.Response;
                using (Stream respStream = rsp.GetResponseStream())
                {
                   req= (Request)e.UserState;
                   resp=Utilities.ParseWithoutSoapEnv(respStream);

                }

            }
            else
            {
                Exception objErr = (Exception)e.Error.GetBaseException();
                throw objErr;
            }
        }
        else
        { 
        //Parse e.Result
        }
    }
    catch (Exception ex)
    {}
}

被调用的函数Utilities.ParseWithoutSoapEnv(respStream);返回类型Response

我想要做的是从该函数获取响应,并使其成为uploadXMLData的返回值

但是我无法更改回调函数的返回类型,因此我不知道该怎么做。

当有人调用我的webservice函数时,他们希望它返回一个Response类型,并且我需要的Response类正在接收到CallBack函数。

希望我明白我的问题

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

如果您使用Task Asynchronous PatternHttpClient,事情会变得容易一些。您需要修改方法以返回Task<Response>

public async Task<Response> UploadXmlDataAsync(
                 string destinationUrl, 
                 string requestXml,
                 Request req)
{
    try
    {
        Response resp=new Response();
        System.Uri uri = new System.Uri(destinationUrl);

        var httpClient = new HttpClient();
        var response = await httpClient.PostAsync(Uri, new StringContent(requestxml))
                               .ConfigureAwait(false);
        var responeStream = response.Content.ReadAsStreamAsync().ConfigureAwait(false);

        return Utilities.ParseWithoutSoapEnv(responseStream);
    }
}

当你把它调到调用堆栈的更高位置时,你也需要await

public async Task FooAsync()
{
    var parsedResponse = await UploadXmlDataAsync(url, xml, request);
    // Do something with response.
}

如果您想要同步替代方案,您也可以这样做:

public Response UploadXmlData(string destinationUrl, string requestXml,Request req)
{
    Response resp=new Response();
    System.Uri uri = new System.Uri(destinationUrl);
    using (WebClient client = new WebClient())
    {
        var response = client.UploadString(uri, "POST", requestXml, req);
        using (var responseStream = new MemoryStream(Encoding.UTF8.GetBytes(response))
        {
            return Utilities.ParseWithoutSoapEnv(responseStream);
        }
    }
}