CLR问题,求解

diffmaker 2009-05-06 06:00:45
环境:VS2005,SQL Server 2005
要求:想写一个CLR存储过程,该过程读取数据库中的表,然后将相应的数据提交到远程Web地址(HTTP方式)
错误:
在执行用户定义例程或聚合 'sp_sync_data' 期间出现 .NET Framework 错误: 
System.Security.SecurityException: Request for the permission of type 'System.Net.WebPermission, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.
System.Security.SecurityException:
at StoredProcedures.SyncData()

代码:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.IO;
using System.Net;
using System.Text;
using System.Collections;
using System.Security.Permissions;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SyncData()
{
string conn_string = "context connection = true";
string uri = "{0}?o={1}&r={2}";
string sql = "select syncuri,oid,reservea from mydatatable";
SqlDataAdapter sda = new SqlDataAdapter(sql, conn_string);
try
{
DataTable dt = new DataTable();
sda.Fill(dt);
for (int i = 0; i < dt.Rows.Count; i++)
{
string syncuri = dt.Rows[i]["syncuri"].ToString();
string oid = dt.Rows[i]["oid"].ToString();
string reservea = dt.Rows[i]["reservea"].ToString();
string syncresult = GetHttpRequest(string.Format(uri, syncuri, oid, reservea));
if (syncresult == "1")
{
//etc
}
}
}
catch (Exception ex)
{
throw ex;
}
}
private static string GetHttpRequest(string uri)
{
#region 这样也不成,晕

WebPermission oWebPermision = new WebPermission(PermissionState.None);
oWebPermision.AddPermission(NetworkAccess.Connect, uri);
oWebPermision.AddPermission(NetworkAccess.Accept, uri);
oWebPermision.Demand();

#endregion

string strResult = string.Empty;
WebRequest oRequest = null;
WebResponse oResponse = null;
StreamReader oStreamReader = null;
try
{
oRequest = WebRequest.Create(uri);
oRequest.ContentType = "application/x-www-form-urlencoded";
oRequest.Method = "GET";
oResponse = oRequest.GetResponse();
oStreamReader = new StreamReader(oResponse.GetResponseStream(), Encoding.Default);
strResult = oStreamReader.ReadToEnd();
oStreamReader.Close();
oStreamReader = null;
oResponse.Close();
oResponse = null;
}
catch(Exception ex)
{
throw ex;
}
return strResult;
}
};


我加了上面的WebPermission后,也没有解决问题,以前没有搞过这方面的东西,搞过的朋友怎么解决呀?还望不吝赐教。
...全文
230 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
wojiaoxiaochun 2012-07-25
  • 打赏
  • 举报
回复
解决了,不把办法分享一下。
xzl495729772 2011-11-08
  • 打赏
  • 举报
回复
我也遇到同样的问题,能告诉解决办法吗 ?
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 readfuture 的回复:]
引用 13 楼 diffmaker 的回复:
问题已经解决,感谢各位给予支持。

恭喜
[/Quote]
呵呵,在结帖,没有能给您加分,对不住了
readfuture 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 diffmaker 的回复:]
问题已经解决,感谢各位给予支持。
[/Quote]
恭喜
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
问题已经解决,感谢各位给予支持。
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
期待中……
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zzxap 的回复:]
namespace Microsoft.Samples.SqlServer
{
public sealed partial class Hello
{
private Hello()
{
}

[System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\"), Microsoft.SqlServer.Server.SqlProcedure]
public static void Xp_ExecProd(string prodcmd, out string greeting)
{
using (SqlConnection conn = new SqlConnection(\"context connection…
[/Quote]

这是.net 1.1 的吗?
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zzxap 的回复:]
http://www.51cto.com/art/200706/50114.htm
[/Quote]
看了一遍,没有发现与问题相关的内容啊
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Garnett_KG 的回复:]
部署到SQL Server时,指定UNSAFE。

SQL code

CREATE ASSEMBLY xxx
FROM 'xxx.dll'
WITH PERMISSION_SET = UNSAFE;
[/Quote]


我用VS的自动部署
错误 1 针对程序集 'SqlServerHttpCLR' 的 CREATE ASSEMBLY 失败,因为程序集 'SqlServerHttpCLR' 未获授权(PERMISSION_SET = UNSAFE)。 当符合以下两个条件之一时,将对程序集授权: 数据库所有者(DBO)具有 UNSAFE ASSEMBLY 权限,而且数据库的 TRUSTWORTHY 属性处于打开状态;或者,程序集签名时所使用的证书或非对称密钥所对应的登录名具有 UNSAFE ASSEMBLY 权限。 SqlServerHttpCLR
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bloodish 的回复:]
跟CLR么关系,Request的有几个属性还是要设一下的,楼主参考下post和get的代码吧

Post方式:

public string Post(string url, string content, string referer)
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(new Uri(url));
request.UserAgent = this.reqUserAgent;
request.CookieContainer = this.cookieContainer;

[/Quote]

没有看懂,this.这些是什么?
Garnett_KG 2009-05-06
  • 打赏
  • 举报
回复
部署到SQL Server时,指定UNSAFE。


CREATE ASSEMBLY xxx
FROM 'xxx.dll'
WITH PERMISSION_SET = UNSAFE;

zzxap 2009-05-06
  • 打赏
  • 举报
回复
namespace Microsoft.Samples.SqlServer
{
public sealed partial class Hello
{
private Hello()
{
}

[System.Diagnostics.CodeAnalysis.SuppressMessage(\"Microsoft.Design\", \"CA1021:AvoidOutParameters\"), Microsoft.SqlServer.Server.SqlProcedure]
public static void Xp_ExecProd(string prodcmd, out string greeting)
{
using (SqlConnection conn = new SqlConnection(\"context connection=true\"))
{
int rtn;
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = prodcmd;
conn.Open();
try
{
rtn = cmd.ExecuteNonQuery();

}
finally
{

}

Microsoft.SqlServer.Server.SqlMetaData columnInfo
= new Microsoft.SqlServer.Server.SqlMetaData(\"Column1\", SqlDbType.NVarChar, 50);
SqlDataRecord greetingRecord
= new SqlDataRecord(new Microsoft.SqlServer.Server.SqlMetaData[] { columnInfo });
greetingRecord.SetString(0, rtn.ToString());
SqlContext.Pipe.Send(greetingRecord);
greeting = rtn.ToString();
}
}
}
}

zzxap 2009-05-06
  • 打赏
  • 举报
回复
http://www.51cto.com/art/200706/50114.htm
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
谢谢bloodish,回家研究一下子。
bloodish 2009-05-06
  • 打赏
  • 举报
回复
跟CLR么关系,Request的有几个属性还是要设一下的,楼主参考下post和get的代码吧

Post方式:

public string Post(string url, string content, string referer)
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(new Uri(url));
request.UserAgent = this.reqUserAgent;
request.CookieContainer = this.cookieContainer;
request.Referer = referer;
byte[] bytes = Encoding.GetEncoding("GB2312").GetBytes(content);
request.Method = "POST";
request.Timeout = this.timeout;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = bytes.Length;
if ((this.proxy != null) && (this.proxy.Credentials != null))
{
request.UseDefaultCredentials = true;
}
request.Proxy = this.proxy;
Stream requestStream = request.GetRequestStream();
requestStream.Write(bytes, 0, bytes.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
return reader.ReadToEnd();
}

Get方式:

public string Get(string url, string referer)
{
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(new Uri(url));
request.UserAgent = this.reqUserAgent;
request.CookieContainer = this.cookieContainer;
request.Referer = this.MainUrl;
request.Method = "GET";
request.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Timeout = this.timeout;
if ((this.proxy != null) && (this.proxy.Credentials != null))
{
request.UseDefaultCredentials = true;
}
request.Proxy = this.proxy;
HttpWebResponse response = (HttpWebResponse) request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
return reader.ReadToEnd();
}
blestcc 2009-05-06
  • 打赏
  • 举报
回复
太長了,看了頭暈
diffmaker 2009-05-06
  • 打赏
  • 举报
回复
我是想能过触发器还调用这个过程,当向表中插入数据时,就调用它,将数据同步到指定的地址

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧