Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用FlUrl进行XML POST_C#_C# 5.0_Dotnet Httpclient_Flurl - Fatal编程技术网

C# 如何使用FlUrl进行XML POST

C# 如何使用FlUrl进行XML POST,c#,c#-5.0,dotnet-httpclient,flurl,C#,C# 5.0,Dotnet Httpclient,Flurl,在处理Json/UrlEncoded请求方面做得很好。但是,文档并没有真正指出如何处理其他请求类型,例如text/xml 使用FlUrl进行XML POST的最佳方法是什么 这(访问底层的HttpClient)有点违背了使用FlUrl的目的,因为您需要再次构建URI和内容: var result = await "http://someUrl" .AppendPathSegment(pathSegment) .SetQu

在处理Json/UrlEncoded请求方面做得很好。但是,文档并没有真正指出如何处理其他请求类型,例如
text/xml

使用FlUrl进行XML POST的最佳方法是什么

这(访问底层的
HttpClient
)有点违背了使用FlUrl的目的,因为您需要再次构建URI和内容:

var result = await "http://someUrl"
                   .AppendPathSegment(pathSegment)
                   .SetQueryParam("name", name)
                   .WithBasicAuth(_userName, _apiToken)
                   .HttpClient
                   .PostAsync(<uri>, <content>);
var结果=等待”http://someUrl"
.AppendPathSegment(路径段)
.SetQueryParam(“名称”,名称)
.WithBasicAuth(\u用户名,\u apiToken)
.HttpClient
.PostAsync(,);

XML支持尚未成熟,但这是并且是我希望为Flurl.Http 1.0保留的为数不多的功能之一。(令人惊讶的是,直到现在还没有人提出要求。)

同时,您可以通过扩展方法自己添加这种支持。要流畅地发布XML字符串,您只需执行以下操作:

public static class FlurlXmlExtensions
{
    // chain off an existing FlurlClient:
    public static async Task<HttpResponseMessage> PostXmlAsync(this FlurlClient fc, string xml) {
        try {
            var content = new CapturedStringContent(xml, Encoding.UTF8, "application/xml");
            return await fc.HttpClient.PostAsync(fc.Url, content);
        }
        finally {
            if (AutoDispose)
                Dispose();
        }
    }

    // chain off a Url object:
    public static Task<HttpResponseMessage> PostXmlAsync(this Url url, string xml) {
        return new FlurlClient(url, true).PostXmlAsync(xml);
    }

    // chain off a url string:
    public static Task<HttpResponseMessage> PostXmlAsync(this string url, string xml) {
        return new FlurlClient(url, true).PostXmlAsync(xml);
    }
}
公共静态类FlurlXmlExtensions
{
//链接现有FlurlClient:
公共静态异步任务PostXmlAsync(此FlurlClient fc,字符串xml){
试一试{
var content=newcapturedstringcontent(xml,Encoding.UTF8,“application/xml”);
返回wait-wait-fc.HttpClient.PostAsync(fc.Url,content);
}
最后{
如果(自动处置)
处置();
}
}
//链接Url对象:
公共静态任务PostXmlAsync(此Url,字符串xml){
返回新的FlurlClient(url,true).PostXmlAsync(xml);
}
//链接url字符串:
公共静态任务PostXmlAsync(此字符串url,字符串xml){
返回新的FlurlClient(url,true).PostXmlAsync(xml);
}
}

更新:

我决定不在Flurl中包含XML支持,主要是因为一位社区成员为它创建了一个强大的扩展库:


通过源代码挖掘,似乎有一个
SendAsync
正在进行中。由于最新的软件包还不支持它,我想添加我自己的:

public static class FlurlHttpExtensions
{
    /// <summary>
    /// Sends an asynchronous POST request of specified data (usually an anonymous object or dictionary) formatted as XML.
    /// </summary>
    /// <param name="client">The FlurlClient</param>
    /// <param name="serializedXml">Data to be serialized and posted.</param>
    /// <returns>A Task whose result is the received HttpResponseMessage.</returns>
    public static Task<HttpResponseMessage> PostXmlAsync(this FlurlClient client, string serializedXml)
    {
        var request = new HttpRequestMessage(HttpMethod.Post, client.Url.ToString())
        {
            Content = new CapturedStringContent(serializedXml, Encoding.UTF8, "text/xml"),
            Method = HttpMethod.Post
        };
        return client.HttpClient.SendAsync(request);
    }
}
公共静态类FlurlHttpExtensions
{
/// 
///发送格式化为XML的指定数据(通常是匿名对象或字典)的异步POST请求。
/// 
///慌乱的客户
///要序列化和发布的数据。
///其结果是收到的HttpResponseMessage的任务。
公共静态任务PostXmlAsync(此FlurlClient客户端,字符串序列化DXML)
{
var request=newhttprequestmessage(HttpMethod.Post,client.Url.ToString())
{
Content=newcapturedstringcontent(serializedXml,Encoding.UTF8,“text/xml”),
方法=HttpMethod.Post
};
返回client.HttpClient.SendAsync(请求);
}
}
是的,我采取了一些快捷方式,比如接受序列化的XML,而不是自己序列化。目前,这对我很有效


如果有更好的办法,我洗耳恭听

对于我的场景,我只需要发布XML的字符串表示,同时能够将内容类型设置为
text/XML
,将编码设置为
utf-8
。我不确定是否有一种更简单的方法来实现这一点,我只是没有看到,但这里有一种扩展方法让我达到了目的:

public static class FlurlXmlExtensions
    {
        /// <summary>
        /// Sends an asynchronous POST request that contains an XML string.
        /// </summary>
        /// <param name="client">The IFlurlClient instance.</param>
        /// <param name="data">Contents of the request body.</param>
        /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation. Optional.</param>
        /// <param name="completionOption">The HttpCompletionOption used in the request. Optional.</param>
        /// <returns>A Task whose result is the received HttpResponseMessage.</returns>
        public static Task<HttpResponseMessage> PostXmlStringAsync(this IFlurlClient client, string data, CancellationToken cancellationToken = default(CancellationToken), HttpCompletionOption completionOption = HttpCompletionOption.ResponseContentRead)
        {
            var content = new CapturedStringContent(data, Encoding.UTF8, "text/xml");

            return client.SendAsync(HttpMethod.Post, content: content, cancellationToken: cancellationToken, completionOption: completionOption);
        }

    }
公共静态类FlurlXmlExtensions
{
/// 
///发送包含XML字符串的异步POST请求。
/// 
///IFlurlClient实例。
///请求正文的内容。
///可由其他对象或线程用于接收取消通知的取消令牌。可选。
///请求中使用的HttpCompletionOption。可选。
///其结果是收到的HttpResponseMessage的任务。
公共静态任务PostXmlStringAsync(此IFlurlClient客户端,字符串数据,CancellationToken CancellationToken=default(CancellationToken),HttpCompletionOption completionOption=HttpCompletionOption.ResponseContentRead)
{
var content=newcapturedstringcontent(数据,Encoding.UTF8,“text/xml”);
返回client.sendaync(HttpMethod.Post,内容:content,cancellationToken:cancellationToken,completionOption:completionOption);
}
}

我做这件事有点晚了,但是我已经设法在Xml中使用Flurl nativly(在Xml扩展方面遇到了问题)

首先,获取xml数据字符串,将其转换为Html内容

var httpContent = new StringContent(xmlDateString, Encoding.UTF8, "text/xml");
然后,在正常的postasync呼叫中使用该内容

var response = await "http://localhost/Notices/webservices/importer.asmx"
        .WithHeader("Authorization", "Basic ssssserrrrr")
        .WithHeader("Content-Type", "text/xml")
        .WithHeader("SOAPAction", "\"http://tempuri.org/ImportData\"")
        .PostAsync(httpContent);
在这个调用中,我正在设置内容类型。我还设置了soap操作(这是我正在调用的web方法)


然后它会正常工作。

FlurlRequest的修订版

public static class FlurlXmlExtensions
{
    // chain off an existing FlurlRequest:
    public static async Task<HttpResponseMessage> PostXmlAsync(this IFlurlRequest fr, string xml)
    {
        var content = new CapturedStringContent(xml, Encoding.UTF8, "application/xml");
        return await fr.PostAsync(content);
    }

    // chain off a Url object:
    public static Task<HttpResponseMessage> PostXmlAsync(this Url url, string xml)
    {
        return new FlurlRequest(url.Path).PostXmlAsync(xml);
    }

    // chain off a url string:
    public static Task<HttpResponseMessage> PostXmlAsync(this string url, string xml)
    {
        return new FlurlRequest(url).PostXmlAsync(xml);
    }
}
公共静态类FlurlXmlExtensions
{
//链接现有FlurlRequest:
公共静态异步任务PostXmlAsync(此IFlurlRequest fr,字符串xml)
{
var content=newcapturedstringcontent(xml,Encoding.UTF8,“application/xml”);
返回等待fr.PostAsync(内容);
}
//链接Url对象:
公共静态任务PostXmlAsync(此Url,字符串xml)
{
返回新的FlurlRequest(url.Path).PostXmlAsync(xml);
}
//链接url字符串:
公共静态任务PostXmlAsync(此字符串url,字符串xml)
{
返回新的FlurlRequest(url).PostXmlAsync(xml);
}
}

CapturedStringContent
打得不错,我忘了。我发现,如果出现任何问题,能够在事后检查原始请求正文(通常是很小的)内存占用是值得的。是的,
SendAsync
是一项正在进行的工作。它将稍微改变可扩展性模式,这样您就不必亲自执行try/finally/dispose部分。准备好后我会回来更新我的答案,但这不会导致此实现中断。有没有方法指定