C# 如何返回KML内容
我正在尝试制作一个连接到我的数据库的web api,获取一些地理数据,然后返回一个网页将使用的KML内容(在google maps iframe/div上显示信息) 我正在使用sharpKML(我不知道这是否是正确的选择): 但当我打电话时,我得到了一个例外: System.InvalidOperationException: 'ObjectContent'1'类型未能序列化内容类型'application/vnd.google earth.kml+xml的响应正文;字符集=utf-8' 我错过了什么 解决方案C# 如何返回KML内容,c#,asp.net-mvc-4,asp.net-web-api,kml,sharpkml,C#,Asp.net Mvc 4,Asp.net Web Api,Kml,Sharpkml,我正在尝试制作一个连接到我的数据库的web api,获取一些地理数据,然后返回一个网页将使用的KML内容(在google maps iframe/div上显示信息) 我正在使用sharpKML(我不知道这是否是正确的选择): 但当我打电话时,我得到了一个例外: System.InvalidOperationException: 'ObjectContent'1'类型未能序列化内容类型'application/vnd.google earth.kml+xml的响应正文;字符集=utf-8' 我错过
不幸的是,正如在回答中所说的,即使我在运行中创建了KML内容,它也不会显示在地图上,因为URL必须由Google公开访问(用于缓存目的)。我必须改变方法。首先尝试一下,我想知道任何对象的序列化是否有问题:
private string SerializeObject<T>(this T toSerialize)
{
XmlSerializer xmlSerializer = new XmlSerializer(toSerialize.GetType());
StringWriter textWriter = new StringWriter();
xmlSerializer.Serialize(textWriter, toSerialize);
return textWriter.ToString();
}
public class KmlController : ApiController
{
public string Get()
{
Point point = new Point();
point.Coordinate = new Vector(37.42052549, -122.0816695);
Placemark placemark = new Placemark();
placemark.Name = "Somewhere";
placemark.Geometry = point;
Kml kml = new Kml();
kml.Feature = placemark;
return SerializeObject<Kml>(kml);;
}
}
私有字符串序列化对象(此T序列化)
{
XmlSerializer XmlSerializer=新的XmlSerializer(toSerialize.GetType());
StringWriter textWriter=新StringWriter();
序列化(textWriter,toSerialize);
返回textWriter.ToString();
}
公共类KmlController:ApiController
{
公共字符串Get()
{
点=新点();
点坐标=新矢量(37.42052549,-122.0816695);
Placemark Placemark=新的Placemark();
placemark.Name=“某处”;
placemark.Geometry=点;
Kml Kml=新的Kml();
kml.特征=地点标记;
返回序列化对象(kml);;
}
}
如果失败,我建议您参考序列化文档,这样您就可以找到哪个对象没有正确序列化
这对我来说很有用
public static byte[] SerializeKml(this KmlFile kml)
{
var serializer = new Serializer();
serializer.Serialize(kml.Root);
var str = serializer.Xml;
var bytes = new byte[str.Length * sizeof(char)];
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public ActionResult GetKml()
{
Placemark placemark = new Placemark
{
Geometry = new Point { Coordinate = new Vector(-13.163959, -72.545992) },
Name = "Machu Picchu",
};
var kml = KmlFile.Create(placemark, false);
var fcResult = new FileContentResult(kml.SerializeKml(), "application/vnd.google-earth.kml+xml") { FileDownloadName = "MachuPicchu.kml" };
return fcResult;
}
奇怪的是,您正在序列化方法本身。媒体格式化程序在Global.asax类的Register方法上设置。我猜这与您的formattersHow有冲突,您建议这样做吗?我试图返回一个Kml对象,但自己没有管理序列化,但没有成功(类似的例外):“ObjectContent`1'类型未能序列化内容类型'application/xml;charset=utf-8'的响应体。”“是的,它失败了:异常详细信息已本地化,翻译后的内容是:类型“SharpKml.Dom.Kml”的反射中出错。这很可能意味着您的一个对象不可[序列化]。我开始认为
内的
标记具有不同的XML命名空间,这使得序列化程序失败…XML格式化程序使用的默认序列化程序是DataContractSerializer
,因此,您可以首先使用该序列化程序检查序列化类型以清除任何序列化问题如果我使用特定于SharpKml的序列化程序,我会得到一个好的KML字符串:var serializer=new serializer();serializer.Serialize(kml);var xml=serializer.xml;
public static byte[] SerializeKml(this KmlFile kml)
{
var serializer = new Serializer();
serializer.Serialize(kml.Root);
var str = serializer.Xml;
var bytes = new byte[str.Length * sizeof(char)];
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
return bytes;
}
public ActionResult GetKml()
{
Placemark placemark = new Placemark
{
Geometry = new Point { Coordinate = new Vector(-13.163959, -72.545992) },
Name = "Machu Picchu",
};
var kml = KmlFile.Create(placemark, false);
var fcResult = new FileContentResult(kml.SerializeKml(), "application/vnd.google-earth.kml+xml") { FileDownloadName = "MachuPicchu.kml" };
return fcResult;
}