我试图在.ASMX Web服务中获取代码并将其更改为类库项目.Web服务项目有一个web.config文件,其中包含:
<applicationSettings>
<myService.Properties.Settings>
<setting name="DownloadChunkSize" serializeAs="String">
<value>100000</value>
</setting>
Run Code Online (Sandbox Code Playgroud)
..并且FileService.asmx.cs文件中的代码使用它来检索值:
int chunkSize = (int)Properties.Settings.Default.DownloadChunkSize;
Run Code Online (Sandbox Code Playgroud)
当我尝试重新构建此代码以消除.asmx Web服务时,我的类库项目中出现编译时错误,因为不再有web.config可用.让我试着解释一下我到目前为止所做的事情(以及为什么):
这样做的动机是简化我的项目.也就是说,我有一个带有.asmx项目的Vstudio解决方案.它有一些方法,并封装了与供应商提供的另一个.asmx Web服务的通信.
我尝试的新设计如下:
项目1是一个名为ProxyASMX的类库项目,其中包含对供应商Web服务的Web引用.我这里没有提供代码; 它只是一个指向供应商Web服务的小app.config.
Project 2是一个类库项目,引用了ProxyASMX.dll.此FileService.cs文件中的代码与我的原始Web服务相同,但[webmethod]属性已被删除.这是我编译时遇到问题的项目.
Project 3是一个带有2个HTTPHandler的Web应用程序项目 - Upload.ashx和Download.ashx.该项目将引用Project 2类库.我尝试用原始解决方案中更全面的web.config内容替换小的默认web.config内容,但是当这不起作用时,我想我最好向专家咨询一下这个冒险.
我希望上面的草图很清楚.我认为这应该是非常可行但现在我不太确定.
以前,我遇到了一个问题,试图在我的ASMX webservice和我的.aspx页面之间共享一个类型定义(webclient)
据我所知,这个建议的"问题"可以通过将客户端中创建的对象数组复制到ASMX代理类定义的新对象数组来解决.
作为C#的新秀,我仍在努力完成这项简单的任务.以下是我的代码的更多部分(上一篇文章中的其他片段保持不变):
...这里是我填充"测试数据"的地方,我想传递给Web服务:
// create an array of MetaData objects
MetaData[] nvPairs = new MetaData[20]; // arbitrary length of 20 pairs
// create arbitrary MetaData objects in the array
nvPairs[0] = new MetaData("Grant Number", "2577-9912");
nvPairs[1] = new MetaData("OPEAnalyst", "Simpson");
Run Code Online (Sandbox Code Playgroud)
...这里我尝试一个函数从我的TRIMBrokerUtil命名空间中定义的"真实"类型(由于代理我不能完全使用)"复制"到该类型的代理版本:
protected TRIMBrokerASMXProxy.ASMXProxy.MetaData[] CopyMetaData(
MetaData utilArray)
{
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] outArray =
new TRIMBrokerASMXProxy.ASMXProxy.MetaData[utilArray.Name.Length];
int i;
for (i = 0; i < utilArray.Name.Length; i++)
{
outArray[i].Name = utilArray.Name;
outArray[i].Value = utilArray.Value;
}
return outArray;
}
Run Code Online (Sandbox Code Playgroud)
...然后在这里我尝试调用该函数(编译器在此行标记2个错误:
TRIMBrokerASMXProxy.ASMXProxy.MetaData[] kvData = …Run Code Online (Sandbox Code Playgroud) 我是一个LINQ to XML的新手,我有这个代码可以工作(大部分时间):
private long processFile(StreamWriter oWriter, string inFileName)
{
XDocument xmlDoc = XDocument.Load(inFileName);
List<DocMetaData> docList =
(from d in xmlDoc.Descendants("DOCUMENT")
select new DocMetaData
{
Folder = d.Element("FOLDER").Attribute("name").Value
,
File = d.Element("FILE").Attribute("filename").Value
,
Comment = d.Elements("INDEX")
.Where(i => i.Attribute("name").Value == "Comment(idmComment)")
.First()
.Attribute("value").Value
,
Title = d.Elements("INDEX")
.Where(i => i.Attribute("name").Value == "Title(idmName)")
.First()
.Attribute("value").Value
,
DocClass = d.Elements("INDEX")
.Where(i => i.Attribute("name").Value == "Document Class(idmDocType)")
.First()
.Attribute("value").Value
}
).ToList<DocMetaData>();
OutputListToFile(oWriter, docList);
return docList.LongCount();
}
Run Code Online (Sandbox Code Playgroud)
这在第117行(选择表达式)上失败:
System.NullReferenceException: Object reference not set to …Run Code Online (Sandbox Code Playgroud) 我遇到了一个用于将文件下载到调用HTTPHandler.ashx文件的web方法的问题.处理程序调用webmethod如下:
byte[] docContent;
string fileType;
string fileName;
string msgInfo = brokerService.DownloadFile(trimURL, recNumber, out docContent, out fileType, out fileName);
Run Code Online (Sandbox Code Playgroud)
在被调用的webmethod中,我必须在使用它之前初始化字节数组,否则我会在所有return语句中出现编译器错误:
The out parameter 'docContents' must be assigned to before control leaves the current method
Run Code Online (Sandbox Code Playgroud)
我尝试将其设置为空数组,但这会导致Buffer.BlockCopy方法失败:
Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.
mscorlib
at System.Buffer.BlockCopy(Array src, Int32 srcOffset, Array dst, Int32 dstOffset, Int32 count)
Run Code Online (Sandbox Code Playgroud)
我知道我需要初始化它,但我不知道在访问数据库之前所需的数组长度.通过调试我验证了所有代码的工作原理,除了Buffer.BlockCopy:
public string DownloadFile(string trimURL
, …Run Code Online (Sandbox Code Playgroud) 我是C#的新手,我很确定这个功能可以从根本上改进:
public static Boolean SuffixExists(String strWhole, String sufx)
{
int iLen = sufx.Length;
if (iLen > 0)
{
String s;
s = strWhole.Substring(strWhole.Length - iLen, iLen);
if (sufx != s) return false;
else
s = null;
return true;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
我将从foreach循环中调用此函数.如果传递的子字符串作为传递的整个字符串的后缀出现,那么我将希望通过添加前缀来更改此处传递的整个字符串.我对这段代码进行了一些测试,但我知道它非常难看.我正在使用.Net 3.5和Visual Studio 2008.
c# ×5
.net ×1
arrays ×1
asmx ×1
bytearray ×1
class-design ×1
copying ×1
generics ×1
linq-to-xml ×1
object ×1
string ×1
substring ×1
web-config ×1