You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.1 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Senparc.Weixin.Entities;
using Senparc.NeuChar.MessageHandlers;
#if NET462
using System.Web.Mvc;
using System.Web;
#else
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
#endif
namespace Senparc.Weixin.AspNet.MvcExtension
{
/// <summary>
/// 修复微信换行 bug
/// </summary>
public class FixWeixinBugWeixinResult : ContentResult
{
//private string _content;
protected IMessageHandlerDocument _messageHandlerDocument;
/// <summary>
/// 这个类型只用于特殊阶段目前IOS版本微信有换行的bug\r\n会识别为2行
/// </summary>
public FixWeixinBugWeixinResult(IMessageHandlerDocument messageHandlerDocument)
{
_messageHandlerDocument = messageHandlerDocument;
}
public FixWeixinBugWeixinResult(string content)
{
//_content = content;
base.Content = content;
}
public new string Content
{
get
{
if (base.Content != null)
{
return base.Content;
}
if (_messageHandlerDocument != null)
{
//var textResponseMessag = _messageHandlerDocument.TextResponseMessage;
if (_messageHandlerDocument.TextResponseMessage != null)
{
return _messageHandlerDocument.TextResponseMessage.Replace("\r\n", "\n");
}
//if (_messageHandlerDocument.TextResponseMessage.Equals(String.Empty))
//{
// //无需响应开发者返回了ResponseNoResponse
// return null;
//}
//if (_messageHandlerDocument.ResponseDocument != null)
//{
// //返回XML响应信息
// return _messageHandlerDocument.TextResponseMessage.Replace("\r\n", "\n");
//}
//else
//{
// //返回XML响应信息或用户指定的文本内容
// return _messageHandlerDocument.TextResponseMessage;
//}
}
return null;
}
set { base.Content = value; }
}
#if NET462
public override void ExecuteResult(ControllerContext context)
{
var content = this.Content;
if (content == null)
{
//使用IMessageHandler输出
if (_messageHandlerDocument == null)
{
throw new Senparc.Weixin.Exceptions.WeixinException("执行WeixinResult时提供的MessageHandler不能为Null", null);
}
var finalResponseDocument = _messageHandlerDocument.FinalResponseDocument;
if (finalResponseDocument == null)
{
//throw new Senparc.Weixin.MP.WeixinException("FinalResponseDocument不能为Null", null);
}
else
{
content = finalResponseDocument.ToString();
}
}
context.HttpContext.Response.ClearContent();
context.HttpContext.Response.ContentType = "text/xml";
content = (content ?? "").Replace("\r\n", "\n");
var bytes = Encoding.UTF8.GetBytes(content);
context.HttpContext.Response.OutputStream.Write(bytes, 0, bytes.Length);
}
#else
public override async Task ExecuteResultAsync(ActionContext context)
{
var content = this.Content;
if (content == null)
{
//使用IMessageHandler输出
if (_messageHandlerDocument == null)
{
throw new Senparc.Weixin.Exceptions.WeixinException("执行WeixinResult时提供的MessageHandler不能为Null", null);
}
var finalResponseDocument = _messageHandlerDocument.FinalResponseDocument;
if (finalResponseDocument == null)
{
//throw new Senparc.Weixin.MP.WeixinException("FinalResponseDocument不能为Null", null);
}
else
{
content = finalResponseDocument.ToString();
}
}
context.HttpContext.Response.ContentType = "text/xml";
content = (content ?? "").Replace("\r\n", "\n");
var bytes = Encoding.UTF8.GetBytes(content);
//context.HttpContext.Response.Body.Seek(0, SeekOrigin.Begin);
await context.HttpContext.Response.Body.WriteAsync(bytes, 0, bytes.Length).ConfigureAwait(false);
// return base.ExecuteResultAsync(context);
}
#endif
}
}